Sql-Server

預設情況下不應用密鑰查找?

  • December 20, 2020

我正在嘗試了解覆蓋索引。在 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 必須讀取大量數據,聚集索引掃描可以比非聚集索引查找 + 鍵查找更有效。

這裡有一篇很好的部落格文章。

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