У меня странная проблема с некоторыми внутренними соединениями на моем SQL-сервере. Это очень медленно, хотя все столбцы, которые используются во внутренних соединениях и в предложении where, имеют индексы.SQL-запрос очень медленный, хотя индекс индексирован
Вот мой запрос SQL:
SELECT p.VORNA AS firstName,
p.NACHN AS lastName,
p.USRID AS [user],
o.ORGEH AS OUID,
o.STEXT AS OU,
a.HolidayDate AS absentFrom,
a.HolidayDate AS absentUntil,
k.MessageDate AS actionDate,
'holiday' AS reason
FROM Kondor_User_Activities AS k
INNER JOIN dbo.SAP_Personaldaten AS p ON p.USRID = k.Code
INNER JOIN Kondor_Users u ON u.Users_Id = k.Users_Id
INNER JOIN SAP_OE AS o ON p.ORGEH = o.ORGEH
INNER JOIN Kondor_UsersGrp AS g ON g.UsersGrp_Id = u.UsersGrp_Id
INNER JOIN Kondor_Cities AS c ON c.Cities_Id = u.Cities_Id OR (u.Cities_Id IS NULL AND c.Cities_Id = g.Cities_Id)
INNER JOIN Kondor_FixedHolidays AS a ON k.MessageDate >= a.HolidayDate
AND k.MessageDate < a.HolidayDateEnd
AND a.Cities_Id = c.Cities_Id
--WHERE g.UsersGrp_ShortName NOT LIKE 'UA_%'
WHERE (g.UsersGrp_ShortName < 'UA_' OR g.UsersGrp_ShortName >= 'UA`')
А вот мой план выполнения:
|--Compute Scalar(DEFINE:([Expr1018]='holiday'))
|--Nested Loops(Inner Join, WHERE:([RevisionReport].[dbo].[Kondor_FixedHolidays].[Cities_Id] as [a].[Cities_Id]=[RevisionReport].[dbo].[Kondor_Cities].[Cities_Id] as [c].[Cities_Id] AND [RevisionReport].[dbo].[Kondor_User_Activities].[MessageDate] as [k].[MessageDate]>=[RevisionReport].[dbo].[Kondor_FixedHolidays].[HolidayDate] as [a].[HolidayDate] AND [RevisionReport].[dbo].[Kondor_User_Activities].[MessageDate] as [k].[MessageDate]<[RevisionReport].[dbo].[Kondor_FixedHolidays].[HolidayDateEnd] as [a].[HolidayDateEnd]))
|--Parallelism(Gather Streams)
| |--Hash Match(Inner Join, HASH:([o].[ORGEH])=([p].[ORGEH]), RESIDUAL:([RevisionReport].[dbo].[SAP_Personaldaten].[ORGEH] as [p].[ORGEH]=[RevisionReport].[dbo].[SAP_OE].[ORGEH] as [o].[ORGEH]))
| |--Bitmap(HASH:([o].[ORGEH]), DEFINE:([Bitmap1025]))
| | |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([o].[ORGEH]))
| | |--Table Scan(OBJECT:([RevisionReport].[dbo].[SAP_OE] AS [o]))
| |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([p].[ORGEH]), WHERE:(PROBE([Bitmap1025])=TRUE))
| |--Hash Match(Inner Join, HASH:([Expr1019])=([p].[USRID]), RESIDUAL:([RevisionReport].[dbo].[SAP_Personaldaten].[USRID] as [p].[USRID]=[Expr1019]))
| |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([Expr1019]))
| | |--Compute Scalar(DEFINE:([Expr1019]=CONVERT_IMPLICIT(nvarchar(25),[RevisionReport].[dbo].[Kondor_User_Activities].[Code] as [k].[Code],0)))
| | |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1000], [Expr1024]) WITH UNORDERED PREFETCH)
| | |--Nested Loops(Inner Join, OUTER REFERENCES:([u].[Users_Id]) OPTIMIZED)
| | | |--Nested Loops(Inner Join, WHERE:([RevisionReport].[dbo].[Kondor_Cities].[Cities_Id] as [c].[Cities_Id]=[RevisionReport].[dbo].[Kondor_Users].[Cities_Id] as [u].[Cities_Id] OR [RevisionReport].[dbo].[Kondor_Users].[Cities_Id] as [u].[Cities_Id] IS NULL AND [RevisionReport].[dbo].[Kondor_Cities].[Cities_Id] as [c].[Cities_Id]=[RevisionReport].[dbo].[Kondor_UsersGrp].[Cities_Id] as [g].[Cities_Id]))
| | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([u].[UsersGrp_Id]))
| | | | | |--Clustered Index Scan(OBJECT:([RevisionReport].[dbo].[Kondor_Users].[PK_Kondor_Users] AS [u]), ORDERED FORWARD)
| | | | | |--Clustered Index Seek(OBJECT:([RevisionReport].[dbo].[Kondor_UsersGrp].[PK_Kondor_UsersGrp] AS [g]), SEEK:([g].[UsersGrp_Id]=[RevisionReport].[dbo].[Kondor_Users].[UsersGrp_Id] as [u].[UsersGrp_Id]), WHERE:([RevisionReport].[dbo].[Kondor_UsersGrp].[UsersGrp_ShortName] as [g].[UsersGrp_ShortName]<'UA_' OR [RevisionReport].[dbo].[Kondor_UsersGrp].[UsersGrp_ShortName] as [g].[UsersGrp_ShortName]>='UA`') ORDERED FORWARD)
| | | | |--Table Spool
| | | | |--Index Scan(OBJECT:([RevisionReport].[dbo].[Kondor_Cities].[IX_Kondor_Cities_Countries_Id] AS [c]))
| | | |--Index Seek(OBJECT:([RevisionReport].[dbo].[Kondor_User_Activities].[IX_Kondor_User_Activities_Users_Id] AS [k]), SEEK:([k].[Users_Id]=[RevisionReport].[dbo].[Kondor_Users].[Users_Id] as [u].[Users_Id]) ORDERED FORWARD)
| | |--RID Lookup(OBJECT:([RevisionReport].[dbo].[Kondor_User_Activities] AS [k]), SEEK:([Bmk1000]=[Bmk1000]) LOOKUP ORDERED FORWARD)
| |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([p].[USRID]))
| |--Table Scan(OBJECT:([RevisionReport].[dbo].[SAP_Personaldaten] AS [p]))
|--Table Scan(OBJECT:([RevisionReport].[dbo].[Kondor_FixedHolidays] AS [a]))
Это стало лучше с индексами, но он по-прежнему очень и очень медленно при выборке всех данных. Возможно, у кого-то есть некоторые намеки на меня, как получить все строки за разумное время.
Большое спасибо!
Таблица размеров:
Kondor_FixedHolidays: 14,416 rows
SAP_Personaldaten: 13,001 rows
Kondor_User_Activities: 7,247,086 rows
Вот мой план выполнения, тоже, и я думаю, что ошибка в Kondor_Users_Activities таблице, хотя у меня есть два индекса там. Может быть, кластеризованный индекс будет полезен там вместо некластеризованного индекса?
Используемый индекс, вы можете вставить план выполнения – TheGameiswar
Не могли бы вы добавить визуальный план? Легче читать. –
У вас есть индексы на kondor_fixedholidays messagedate? – BugFinder