Sql-Server
預設情況下不應用密鑰查找?
我正在嘗試了解覆蓋索引。在 Northwind 數據庫中,我從表Categories中選擇:
如您所見,該表在CategoryName列上有一個非聚集索引。
此 SQL 查詢:
select CategoryName from Categories where Categories.CategoryName like 'Beverages'
返回帶有索引查找的執行計劃:
然而,這:
select CategoryName ,Description from Categories where Categories.CategoryName like 'Beverages'
通過使用主鍵索引的索引掃描返回此執行計劃,這不是預期的:
只有當我強制使用非聚集索引進行查詢時,我才能找到預期的行為:
select CategoryName ,Description from Categories with(index(CategoryName)) where Categories.CategoryName like 'Beverages'
問題是什麼?
您的索引中沒有
Description
列,但您的查詢中有列。因此,SQL Server 必須獲取此列。有兩種選擇:
- 非聚集索引查找 + 鍵查找
- 聚集索引掃描
如果您的統計數據讓 SQL Server 認為它會讀取大量數據,則 SQL Server 會在非聚集索引查找 + 鍵查找或聚集索引掃描之間做出選擇,這稱為臨界點。
因為,如果 SQL Server 必須讀取大量數據,聚集索引掃描可以比非聚集索引查找 + 鍵查找更有效。
這裡有一篇很好的部落格文章。