SQL Server最后25条记录查询优化
我在我的一张表中有4百万条记录。我需要获取最近1周内添加的最后25条记录。SQL Server最后25条记录查询优化
这是我当前查询的外观
SELECT TOP(25) [t].[EId],
[t].[DateCreated],
[t].[Message]
FROM [dbo].[tblEvent] AS [t]
WHERE ([t].[DateCreated] >= Dateadd(DAY, Datediff(DAY, 0, Getdate()) - 7, 0)
AND [t].[EId] = 1)
ORDER BY [t].[DateCreated] DESC
现在我没有这个表上执行任何索引,并且不打算生一个。这个查询需要大约10-15秒来运行,我的应用程序超时,现在有办法改善它吗?
您应该EId, DateCreated
或至少DateCreated
创建一个索引没有,我能想到的是通过insert
触发器保持在一个单独的表中的最后25(也可能是update
优化本的这个唯一的出路以及delete
触发器)。
如果表没有索引来支持查询,您将被迫执行表扫描。
您将努力避开表格扫描方面 - 随着表的增长,响应时间会变慢。
你将不得不努力教育你的客户关于他们面临的问题,他们应该考虑索引。他们可能会说不,你需要显示支持推理的证据,向他们展示有/没有的时间,并且确保对插入记录的影响也被显示出来,这对添加记录来说是相对简单的成本/收益/损失索引/不添加它。如果他们坚持没有索引,那么你别无选择,只能延长你的超时时间。
你也应该尝试查询提示: http://msdn.microsoft.com/en-us/library/ms181714.aspx
使用选项FAST n
- 行数。
上的聚集索引这不会有帮助。没有任何索引,SQL Server将需要扫描所有400万行来评估'[EId] = 1'谓词并执行'TOP N'排序。 – 2012-01-27 14:40:34
为什么你不想要一张桌子上的索引? – 2012-01-27 12:58:31
这是一个客户端驱动的调用,他们不需要索引,我不会与它们争论更多! – Vivek 2012-01-27 13:02:07
该告诉他们与之共处或获得更快的光盘子系统。点。当客户与现实矛盾时,现实会获胜,并不在乎客户的妄想。在Sql级别上你可以做的很多优化都没有摆脱你强制执行的表扫描的IO。 – TomTom 2012-01-27 13:03:43