【发布时间】:2015-04-15 03:57:28
【问题描述】:
此查询运行速度非常快(
SELECT TOP (10)
[Extent2].[CompanyId] AS [CompanyId]
,[Extent1].[Id] AS [Id]
,[Extent1].[Status] AS [Status]
FROM [dbo].[SplittedSms] AS [Extent1]
INNER JOIN [dbo].[Sms] AS [Extent2]
ON [Extent1].[SmsId] = [Extent2].[Id]
WHERE [Extent2].[CompanyId] = 4563
AND ([Extent1].[NotifiedToClient] IS NULL)
如果我只添加一个时间过滤器,它会花费太长时间(22 秒!):
SELECT TOP (10)
[Extent2].[CompanyId] AS [CompanyId]
,[Extent1].[Id] AS [Id]
,[Extent1].[Status] AS [Status]
FROM [dbo].[SplittedSms] AS [Extent1]
INNER JOIN [dbo].[Sms] AS [Extent2]
ON [Extent1].[SmsId] = [Extent2].[Id]
WHERE [Extent2].Time > '2015-04-10'
AND [Extent2].[CompanyId] = 4563
AND ([Extent1].[NotifiedToClient] IS NULL)
我尝试在Sms 表的[Time] 列上添加索引,但优化器似乎没有使用该索引。尝试使用With (index (Ix_Sms_Time));但令我惊讶的是,这需要更多时间(29 秒!)。
这是实际的执行计划:
两个查询的执行计划相同。这里提到的表有 5M 到 8M 行(索引是
【问题讨论】:
-
尝试添加 ORDER BY ASC 或 DESC TIME 列并检查。它应该运行得更快。
-
首先,没有
ORDER BY,TOP查询返回的行是不确定的。最佳实践是使用TOP指定ORDER BY。要提高第二个查询的性能,请尝试对 CompanyID 和 Time 使用复合非聚集索引。这将避免接触行 -
试过
Order By [Time];更糟糕的是,29 秒! -
你能发布创建表的脚本吗?连同索引定义
-
能否请您在某处发布实际执行计划,以便我们访问它并查看实际矩阵?
标签: sql-server database query-optimization