之间SQL性能上的差异,我有两个非常simmilar查询:1秒是什么在ASC和DESC
exec sp_executesql N'SELECT TOP (1) [t0].[Production]
FROM [dbo].[T_Production] AS [t0]
WHERE [t0].[InputID] = @p0
ORDER BY [t0].[Timestamp] DESC',N'@p0 int',@p0=1161
exec sp_executesql N'SELECT TOP (1) [t0].[Production]
FROM [dbo].[T_Production] AS [t0]
WHERE [t0].[InputID] = @p0
ORDER BY [t0].[Timestamp]',N'@p0 int',@p0=1161
第一个执行,31秒另外一个,为什么?
有趣的是,如果我改变从存储过程的第二个查询到
SELECT TOP (1) [t0].[Production]
FROM [dbo].[T_Production] AS [t0]
WHERE [t0].[InputID] = 1161
ORDER BY [t0].[Timestamp]
也exectues在1秒内
,但令人惊讶的是,如果以后[时间戳]所以加空格最后一行看起来像这样ORDER BY [t0].[Timestamp] ',N'@p0 int',@p0=1161
它也是非常快的。
编辑: 经过一些调查我检查实际执行计划和cos是: 选择成本:0 - >顶部成本6 - >索引扫描(非聚集)[T_Production] [_ dta_index_T_Production]花费94
所以我在[Timestamp]上以降序排列添加了新索引。花了几分钟的时间,现在查询执行速度与第一个一样快。
但是在这里我真的很困惑,我注意到现在附加索引的顺序应该是递增的,casuse我已经用descding,但创建另一个帮助?它使我困惑,所以我删除了我刚刚创建的这个索引,现在这个查询仍然像第一个一样快地执行。也许重建索引有帮助?并且这个问题将会返回。
但现在添加和删除索引后,实际执行计划是不同的: select:cost 0 - > top cost:0 - >嵌套循环(内部连接)成本0 - >索引seek(NonClustered).. 。成本33%和密钥查找(成群)..成本:67%
什么是对基础表中的本地排序顺序?如果它是asc,那么desc查询将需要先构建整个结果集,然后才能对desc进行排序。 – 2013-02-19 17:48:49
我该如何检查它? – kosnkov 2013-02-19 17:49:13
'explain plan'或'execution plan':你可以在那里检查.. – aspiring 2013-02-19 17:49:34