【问题标题】:Clustered Index Seek and Non clustered Index seek聚集索引查找和非聚集索引查找
【发布时间】: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


【解决方案1】:

第一个问题:当我们在一个字段上有聚集索引时,不需要在那个字段上建立非聚集索引。

第二个问题:在您的查询中,您只选择了 OrderId 列,在这种情况下,非聚集索引和聚集索引之间没有任何区别。如果您想从 Sales.OrderDetail 表中选择另一个字段,您肯定会看到聚集索引和非聚集索引的性能不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2012-04-30
    • 2023-03-17
    相关资源
    最近更新 更多