asc和desc之间的sql性能有什么不同

时间:2013-02-19 17:47:30

标签: sql sql-server-2008

我有两个非常简单的查询:

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

第一个在1秒内执行,另一个在31秒内执行,为什么?

有趣的是,如果我将第二个查询从商店程序更改为

SELECT TOP (1) [t0].[Production]
FROM [dbo].[T_Production] AS [t0]
WHERE [t0].[InputID] = 1161
ORDER BY [t0].[Timestamp]

它也会在1秒内完成

但令人惊讶的是,如果在[Timestamp]之后添加空格,以便最后一行看起来像ORDER BY [t0].[Timestamp] ',N'@p0 int',@p0=1161,那么它的速度也非常快。

编辑: 经过一番调查后,我检查了实际执行计划和cos是: 选择费用:0 - >最高成本6 - >索引扫描(NonClustered)[T_Production]。[_ dta_index_T_Production]费用94

所以我在[Timestamp]上添加了新的索引,降序排列。花了几分钟时间,现在查询的执行速度和第一个一样快。

但在这里我真的很困惑,我现在注意到附加索引的顺序应该是提升,casuse我已经有了descding,但创建另一个有帮助吗?它让我感到困惑,所以我删除了我刚刚创建的索引,现在这个查询的执行速度仍然和第一个一样快。也许重建索引有帮助吗?这个问题将会重新出现。

但是现在添加和删除索引后,实际的执行计划是不同的: 选择:成本0 - >最高费用:0 - >嵌套循环(内部联接)成本0 - >索引搜索(NonClustered)...成本33%和密钥查找(集群)..成本:67%

1 个答案:

答案 0 :(得分:3)

索引在键中的列上也有ASC和DESC,这可能对执行计划产生影响。

对于这样一个简单的查询来说,这似乎是一个很大的区别,但是看看索引定义和执行计划,可能必须要进行昂贵的额外排序操作。

删除索引几乎肯定会使缓存中的执行计划无效。

为避免参数嗅探,您可以将OPTION (RECOMPILE)与内联参数化查询一起使用,或将代码移动到存储过程中OPTIMIZE FOR UNKNOWN