【发布时间】:2016-03-02 10:48:27
【问题描述】:
我的 SQL - Server 上的一些内部连接有一个奇怪的问题。 尽管在内连接和 where 子句中使用的所有列都有索引,但它非常慢。
这是我的 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 表中,尽管我在那里有两个索引。也许,聚集索引会比非聚集索引更好?
【问题讨论】:
-
是使用的索引,能否粘贴执行计划
-
您能添加视觉计划吗?更容易阅读。
-
您对 kondor_fixedholidays messagedate 有索引吗?
-
是的。说真的,给我们一个 .sqlplan 文件的链接。假设和实际。它不仅更容易,而且比您发布的这篇小文章还包含更多信息。
-
在任何人考虑尝试提供帮助之前。此人在对我的回答的评论中表示,即使他的查询时间超过 1 小时,他也会在 10 分钟后中止任何答案。
标签: sql sql-server performance