平台:SQL Server 2012的为什么这个指标并不能提高查询性能
背景:我有两个相当大的日志表 - 600K左右记录每个正在使用PK/FK加入。为了争论起见,我们称它们为ReallyBigLog1和ReallyBigLog2。查询(下面)大约需要3.5秒才能运行。 WHERE子句包含三个不同的值。当被要求帮助改进此查询时,我立即注意到WHERE子句中的项目未被编入索引。我踌躇满志地建议添加索引 - 假设提高的性能会让我看起来像英雄。但是,额外的指数没有可衡量的影响。
问题:给定下面的查询,为什么索引StartTime,EndTime和DateStamp对查询时间没有可测量的影响?
查询
SELECT
IrreleventField1,
IrreleventField2,
IrreleventField3....
FROM [dbo].[ReallyBigLog1] AS [T1]
INNER JOIN [dbo].[ReallyBigLog2] AS [T2] ON [T1].[Id] = [T2].[Id]
WHERE ([T1].[EndTime] IS NOT NULL) AND ([T1].[StartTime] IS NOT NULL) AND ([T2].[DateStamp] >= '2017-5-16 00:00:00')
指标
CREATE NONCLUSTERED INDEX [ix_RecommendedIndex]
ON [dbo].[ReallyBigLog1]
([StartTime] , [EndTime])
CREATE NONCLUSTERED INDEX [IX_DateStamp]
ON [dbo].[ReallyBigLog2]
([DateStamp])
执行计划
5 SELECT
4 Compute Scalar
3 Merge Join/Inner Join Merge:([dbo].[ReallyBigLog1].[Id] [T2]=[dbo].[ReallyBigLog1].[Id] [T1]), Residual:([dbo].[ReallyBigLog2].[Id] as [T2].[Id]=[dbo].[ReallyBigLog1].[Id] as [T1].[Id])
1 Clustered Index Scan Predicate:([dbo].[ReallyBigLog1].[StartTime] as [T1].[StartTime] IS NOT NULL AND [dbo].[ReallyBigLog1].[EndTime] as [T1].[EndTime] IS NOT NULL), ORDERED FORWARD [dbo].[ReallyBigLog1].[PK_dbo.ReallyBigLog1] [T1]
2 Clustered Index Scan Predicate:([dbo].[ReallyBigLog2].[DateStamp] as [T2].[DateStamp]>='2017-05-16 00:00:00.000'), ORDERED FORWARD [dbo].[ReallyBigLog2].[PK_dbo.ReallyBigLog2] [T2]
编辑(表组成)
SELECT
(SELECT COUNT(*) FROM ReallyBigLog1 WHERE StartTime IS NULL) as NullStartTime,
(SELECT COUNT(*) FROM ReallyBigLog1 WHERE EndTime IS NULL) as NullEndTime,
(SELECT COUNT(*) FROM ReallyBigLog1) as Log1Count,
(SELECT COUNT(*) FROM ReallyBigLog2 WHERE DateStamp > '2017-5-16 00:00:00') AS DateStampUsage,
(SELECT COUNT(*) FROM ReallyBigLog2) AS Log2Count
DateStampUsage Log2Count NullStartTime NullEndTime Log1Count
443038 651929 33748 34144 509545
优化器最有可能估计扫描表更便宜,特别是因为合并连接需要数据进行排序。多少数据与'DateStamp> ='2017-5-16''这个标准相符?这些时间中有多少时间为零? –
谢谢James,我将该信息添加为该问题的编辑。 – SteveJ
看着你的执行计划,它看起来像SQL服务器,根本没有使用新的索引,因此它没有改进任何..因为你在这里提供的有限的数据,我们没有什么可以明确地指定,说这篇文章可能会帮助你一下https://www.simple-talk.com/sql/performance/identifying-and-solving-index-scan-problems/。 – Surendra