使用索引加速ORDER BY子句

Jon*_*ood 0 sql t-sql sql-server clustered-index non-clustered-index

我有一个查询,ORDER BY因为该表有超过1,100万行,所以该子句很慢.

通过在ORDER BY子句中的列上添加聚簇索引,我可以大大加快速度.但是,软件会根据用户设置创建按不同列排序的查询.并且您不能向表中添加多个聚簇索引.

我的问题是:可以使用非聚集索引来提高ORDER BY性能吗?或者有没有关于聚簇索引的特殊内容,这意味着我将无法对所有列快速排序?

注意:我已经在线发布了我的真实查询和执行计划,但还有其他问题我不想在这里讨论.我没有创建数据库或编写查询.即使没有该IN子句,查询仍然很慢.

Bra*_*don 6

非聚集索引绝对可以用于优化排序.索引本质上是二叉搜索树,这意味着它们包含按顺序排序的值.

但是,根据查询,您可能会将SQL Server置于一个难题中.

如果你有100万行的表,您的查询将匹配其中11亿美元,如下面,是不是更便宜地使用一个指数category来选择行和对结果进行排序name,或者阅读全部100万行出来的索引预先排序name,然后通过检查过滤掉它们中的8900万category

select ...
from product
where category = ?
order by name;
Run Code Online (Sandbox Code Playgroud)

从理论上讲,SQL Server可能能够使用索引按name顺序读取行使用索引进行category有效过滤?我持怀疑态度.我很少看到SQL Server使用多个索引来访问同一查询中的同一个表(假设单个表选择,忽略连接或递归CTE).它必须检查指数1亿次.索引每个索引搜索的开销成本很高,因此当单个搜索缩小结果集时,它们会很有效.

在没有看到模式,统计信息和确切查询的情况下,我很难说出什么是有道理的,但我希望我会发现SQL Server会使用where子句的索引并对结果进行排序,而忽略sort列上的索引.

如果您选择整个表,则可以使用排序列上的索引.喜欢select ... from product order by name;

同样,你的milage可能会有所不同.这是基于过去经验的推测.