0

我有一个 SQL 语句(我不能在这里发布)。当我查看它的执行计划时,我发现大部分时间都处于排序状态,然后是索引扫描。

我能做些什么来减少花在排序上的时间吗?任何类型的索引?我可以做些什么来减少索引扫描所花费的时间?

在此处输入图像描述

4

3 回答 3

1

聚集索引扫描本质上是一种表扫描,其中正在检查表中的每一行。

您可能为此查询缺少该表上的索引...查看您正在过滤/加入的字段,并将索引添加到这些列。

这些索引也可能会阻止嵌套循环/排序操作。

于 2012-12-10T20:21:02.513 回答
0

我只是想在这里大声说出来,但是您的查询中是否涉及任何排名功能?我问是因为我在排序后立即看到分段运算符,如果我正在执行 ROW_NUMBER() 或 RANK() 之类的操作,我通常会看到这些运算符。所有此类运算符都需要在 OVER 子句中进行排序,因此,如果您的数据尚未按该指标排序(即,它不是在从中提取数据的表/索引上以这种方式排序),那么引擎将不得不对数据进行排序以获得正确的结果。

于 2012-12-10T20:45:29.323 回答
0

首先,如果您希望人们认真对待您,特别是如果您希望从您的问题中得到准确的回答和帮助,那么您必须包含特定信息。如果有人要帮助他们,他们需要足够的信息来重现您的情况,以便他们自己验证建议的实际帮助。信不信由你,做出回应的人非常棒(感谢所有提供帮助的人),他们通常会测试他们所说的话。如果您有代码限制,因为它的工作相关。您应该有足够的理解,能够创建一个与其他表和列类似的示例,以在不影响代码的情况下显示问题。

重点是,您的示例执行以下操作 1) 嵌套循环:2) 排序

在这种情况下,完成排序是因为(嵌套循环)的结果没有按照需要的方式排序。由于(嵌套循环)的源是顶部表(聚集索引扫描),它按照(聚集索引键)的顺序读取,这显然与需要排序不同。

如果实际在 INDEX 的 KEY 的 ss 部分上排序的字段和查询的所有需要​​的列都包含在索引中,那么它应该对该索引使用“索引扫描”,该索引应该已经由ORDER BY KEY 和 SORT 可以避免。

我对此进行了一些测试,显然 SQL Server 确实使用了索引(如预期的那样),但仍然执行排序(因为数据流已经排序,所以没有像预期的那样)。这可能是应该报告给 MS 的东西,因为优化器应该认识到这一点。

希望这可以帮助..

于 2013-03-30T04:40:07.243 回答