Sql-Server

為什麼掃描聚集索引而不是尋找非聚集索引?

  • April 19, 2020

有SQL腳本:

CREATE TABLE users 
 ( 
    id        INT, 
    firstname VARCHAR(50), 
    surname   VARCHAR(50) 
 ); 

CREATE CLUSTERED INDEX ix_users_id 
 ON users (id); 

CREATE NONCLUSTERED INDEX ix_users_firstname 
 ON users (firstname); 

SELECT firstname, 
      surname 
FROM   users 
WHERE  firstname = 'John';

我不明白為什麼對於上述 SELECT 請求,選擇的 SQL Server 2019 引擎遵循執行計劃:

在此處輸入圖像描述

**為什麼要掃描聚集索引?**我想,更快的是:

  1. 尋找非聚集索引;
  2. 通過聚集索引指針移動聚集索引,儲存在非聚集索引的葉節點中;
  3. 並從那裡獲取休息surname值。

這裡的關鍵思想是您的索引包含(firstname,id)但不包含surname。所以這個查詢的選項

SELECT firstname, 
      surname 
FROM   users 
WHERE  firstname = 'John';

1)掃描聚集索引

  1. 尋找非聚集索引,然後對於索引中的每一個匹配行,在聚集索引上尋找surname. 正是這種“書籤查找”是查詢中最昂貴的部分,如果有合理比例的使用者被命名為“John”,那麼僅掃描聚集索引可能會更便宜。

這就是為什麼我們有包含列的索引。您可以添加surname到索引以使該查詢能夠在非聚集索引上查找,並避免書籤查找。該索引將成為查詢的“覆蓋索引”。例如

CREATE NONCLUSTERED INDEX ix_users_firstname 
 ON users (firstname) 
  include (surname); 

引用自:https://dba.stackexchange.com/questions/265375