假设我有一个大的交易表,其中有一个日期字段和一个按升序排列在该字段上的索引。如果我从表中选择该字段并按相反顺序排序,它是否能够以某种方式反向使用该索引,或者它是否必须执行表扫描或其他一些效率较低的方法来访问这些记录并对它们进行排序?
如果索引覆盖,它可能会与查询计划中的排序操作结合使用以反转顺序。
编辑:多一点思考!
这将取决于这是一个简单的查询还是涉及连接。如果微不足道:
SELECT x,y FROM MyTable ORDER BY y DESC
Run Code Online (Sandbox Code Playgroud)
并且索引顺序是 Y ASC,索引叶级别的反向扫描应该避免排序。
如果非平凡:
SELECT x,y FROM MyTable mt INNER JOIN MyOtherTable mot ON mot.y = mt.y
Run Code Online (Sandbox Code Playgroud)
它应该取决于 MyOtherTable.y 的排序顺序。如果按照 MyTable.y 是 ASC,那么将按索引顺序读取两个索引,并在连接后应用排序。如果是 desc,理论上可以对连接使用逆序索引扫描,并且不需要额外的排序来满足您的 order by 子句。
Edit2:不记得这是否会出现在 SQL Server 的执行计划中。该图标并不表示这是反向扫描,悬停时的工具提示也不表示。然而,属性显示“扫描方向 - 向后”或检查 XML 显示的计划
<IndexScan Ordered="true" --->ScanDirection="BACKWARD"<--- ForcedIndex="false" NoExpandHint="false">
<DefinedValues>
<DefinedValue>
<ColumnReference Database="[TestDb]" Schema="[dbo]" Table="[MyTable]" Column="OtherId" />
</DefinedValue>
</DefinedValues>
<Object Database="[TestDb]" Schema="[dbo]" Table="[MyTable]" Index="[IX_MyTable_OtherId]" />
</IndexScan>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
558 次 |
最近记录: |