Sql-Server

使用多列非聚集索引和中間列上的 SELECT,為什麼 SQL Server 查詢該索引而不是掃描表?

  • October 7, 2021

LastName、FirstName、MiddleName 上設置了單個非集群 - 按此順序。

SELECT * FROM PERSON
WHERE FirstName='xyz'

為什麼執行計劃使用索引而不是直接掃描表?我問是因為名字是索引的第二個成員,因此沒有排序,那麼為什麼 SQL 伺服器決定查詢非聚集索引?

在此處輸入圖像描述

這是使用最少的 IO 操作給出結果的問題。

該索引比整個表小得多,並且基於統計 SQL Server 知道單個名稱 (‘xyz’) 的平均基數。

因此,計算要讀取該索引的頁數加上查找的頁數(出現次數 * 索引深度)以檢索表的其他欄位小於掃描未按名稱排序的整個表。

這可能是您面臨的情況。

嘗試使用set statistics io on和不使用該索引來驗證我的猜測。

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