SQL Server:“單例查找”和“使用者查找”有什麼區別?
微軟將
[user_lookup]
計數器描述dm_db_index_usage_stats
為“使用者查詢的書籤查找次數”。它將[singleton_lookup_count]
in描述dm_db_index_operational_stats
為“從索引或堆中檢索單行的累積計數”。這對我來說根本沒有澄清。有人可以對這兩個值所跟踪的內容提供更清晰的定義/區分嗎?問題源於今天的索引觀察(800m 行表),其中
[user_lookup]
Cx 的目前值約為 800,[singleton_lookup_count]
超過 10 億。他們顯然在計算很多不同的東西,我需要了解它們是什麼,以及這種幅度的差異是否表明存在問題。
由於我將在稍後解釋的原因,這些計數器並不總是易於解釋。它們可以作為一個有用的指標,您可能需要更詳細地分析某些領域。
問題源於今天的索引觀察(800m 行表),其中目前
$$ user_lookup $$Cx 上的值約為 800,而$$ singleton_lookup_count $$超過10億。
該
user_lookup
值表示訪問聚集索引或堆的書籤查找運算符(鍵或RID 查找)在執行計劃中出現了 800 次。該
singleton_lookup_count
值包括使用Key或RID Lookup運算符查找的行數。它還計算對不是查找的聚集索引的每個有保證的單行訪問。當聚集索引是唯一的並且使用了一個或多個相等搜尋謂詞時,就會發生這種情況。單例查找是保證最多找到單個匹配記錄的 b 樹遍歷。對於應用於唯一索引的每個可查找相等謂詞都是這種情況。
例如,如果是唯一索引鍵並使用索引查找,
select id from table where id in (1, 2, 3, 4)
則會導致四次單例查找。id
請注意,不使用書籤查找。Key或RID Lookup只不過是使用相等謂詞的唯一索引查找,因此它們的計數相同。
即使基表是堆或聚集索引不是唯一的,查找總是針對唯一的“索引”。在堆的情況下,唯一的行定位器是堆 RID。對於非唯一聚集索引,唯一行定位符是聚集索引鍵加上任何“唯一標識符”(僅用於實際重複鍵)。
索引使用統計
從查詢執行器(QE)的角度來看,索引使用統計 DMV 包含索引操作的計數。這是負責執行查詢計劃的 SQL Server 組件。
這些計數器的遞增方式並不完全直覺:
- 每次執行計劃時,運算元計數一次。
- 生成估計計劃不會影響總數。
- 在單個計劃執行中執行 10,000 次的Index Seek仍然只會將使用者搜尋次數增加 1。
- 即使根本不執行操作符,它也會被計算在內。
索引操作統計
從儲存引擎(SE)的角度來看,索引操作統計數據 DMV 包含索引和表操作的計數。
這個 DMV 計算每個儲存引擎的操作,使計數器可能更直覺:
- 10,000 次單例查找將增加 10,000 到單例查找計數列
- 執行 5 次的表掃描將使范圍掃描計數增加 5。
有關顯示每個計數器何時遞增的範例,請參閱我的文章Seeking without Indexes。