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秒来运行,我的应用程序超时,现在有办法改善它吗?

+6

为什么你不想要一张桌子上的索引? – 2012-01-27 12:58:31

+0

这是一个客户端驱动的调用,他们不需要索引,我不会与它们争论更多! – Vivek 2012-01-27 13:02:07

+5

该告诉他们与之共处或获得更快的光盘子系统。点。当客户与现实矛盾时,现实会获胜,并不在乎客户的妄想。在Sql级别上你可以做的很多优化都没有摆脱你强制执行的表扫描的IO。 – TomTom 2012-01-27 13:03:43

如果表中有一个自动增量的ID(不是开斋节,但是是一个单独的PK),则可以通过ID desc而不是DateCreated进行订购,这可能会使您的订单更快。

否则你确实需要一个索引(但你的问题说你不需要)。

+0

它不会没有索引 - 仍然是全表扫描。 – TomTom 2012-01-27 13:03:57

+0

嗯,你是对的 - 我隐含地把这个问题解释为“没有额外的索引”到PK – Pleun 2012-01-27 13:06:13

您应该EId, DateCreated或至少DateCreated

创建一个索引没有,我能想到的是通过insert触发器保持在一个单独的表中的最后25(也可能是update优化本的这个唯一的出路以及delete触发器)。

如果表没有索引来支持查询,您将被迫执行表扫描。

您将努力避开表格扫描方面 - 随着表的增长,响应时间会变慢。

你将不得不努力教育你的客户关于他们面临的问题,他们应该考虑索引。他们可能会说不,你需要显示支持推理的证据,向他们展示有/没有的时间,并且确保对插入记录的影响也被显示出来,这对添加记录来说是相对简单的成本/收益/损失索引/不添加它。如果他们坚持没有索引,那么你别无选择,只能延长你的超时时间。

你也应该尝试查询提示: http://msdn.microsoft.com/en-us/library/ms181714.aspx

使用选项FAST n - 行数。

+0

上的聚集索引这不会有帮助。没有任何索引,SQL Server将需要扫描所有400万行来评估'[EId] = 1'谓词并执行'TOP N'排序。 – 2012-01-27 14:40:34