Sql-Server
為什麼掃描聚集索引而不是尋找非聚集索引?
有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 引擎遵循執行計劃:
**為什麼要掃描聚集索引?**我想,更快的是:
- 尋找非聚集索引;
- 通過聚集索引指針移動聚集索引,儲存在非聚集索引的葉節點中;
- 並從那裡獲取休息
surname
值。
這裡的關鍵思想是您的索引包含
(firstname,id)
但不包含surname
。所以這個查詢的選項SELECT firstname, surname FROM users WHERE firstname = 'John';
是
1)掃描聚集索引
- 尋找非聚集索引,然後對於索引中的每一個匹配行,在聚集索引上尋找
surname
. 正是這種“書籤查找”是查詢中最昂貴的部分,如果有合理比例的使用者被命名為“John”,那麼僅掃描聚集索引可能會更便宜。這就是為什麼我們有包含列的索引。您可以添加
surname
到索引以使該查詢能夠在非聚集索引上查找,並避免書籤查找。該索引將成為查詢的“覆蓋索引”。例如CREATE NONCLUSTERED INDEX ix_users_firstname ON users (firstname) include (surname);