【发布时间】:2014-08-27 06:42:51
【问题描述】:
我正在使用 SQL Server 2012 数据库,并希望获得查询优化方面的知识。这样做我遇到了一个疑问,如果有人可以帮助我,我将不胜感激。
Sales.OrderDetails 有两个索引:一个聚集在 Orderid 上,一个非聚集在 Order id. 上
第一个问题:当我们在orderid 上有一个聚集索引时,我们真的需要一个非聚集索引吗?
为了解决我运行了这个查询:
select orderid
from Sales.OrderDetails
where orderid = 10248
两次;一种是启用非聚集索引,另一种是禁用。对于早期版本,它执行非聚集索引查找,而对于后来的 SQL Server,它执行聚集索引查找。实际上查询成本没有区别。
回到我的问题:我们真的需要在已经有一个非聚集索引的键上创建非聚集索引,这会提高性能吗?
图片1:
图片2:
【问题讨论】:
-
如果您在
OrderId上有一个聚集索引,那么同一列上的另一个非聚集索引完全没用 - 只需删除它 -
您不应该在完全相同的列上需要两个索引。聚集索引应该够用了。
-
@marc_s :是的,这就是我的想法。但是要确认我是否在一列上有聚集索引,那么我不需要非聚集索引吗?
-
在某些情况下,在
OrderId上有一个更窄的索引可能很有用。例如与 CI 相比,查询SELECT OrderId FROM YourTable可能使用更少的读取扫描 NCI。 -
@marc_s 是的,这可能是一个罕见的工作负载,同时拥有两个索引是值得的。
标签: sql sql-server sql-server-2012 query-optimization