Sql-Server

SQL Server:“單例查找”和“使用者查找”有什麼區別?

  • August 20, 2022

微軟將[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值包括使用KeyRID Lookup運算符查找的行數。它還計算對不是查找的聚集索引的每個有保證單行訪問。當聚集索引是唯一的並且使用了一個或多個相等搜尋謂詞時,就會發生這種情況。

單例查找是保證最多找到單個匹配記錄的 b 樹遍歷。對於應用於唯一索引的每個可查找相等謂詞都是這種情況。

例如,如果是唯一索引鍵並使用索引查找,select id from table where id in (1, 2, 3, 4)則會導致四次單例查找。id請注意,不使用書籤查找。

KeyRID Lookup只不過是使用相等謂詞的唯一索引查找,因此它們的計數相同。

即使基表是堆或聚集索引不是唯一的,查找總是針對唯一的“索引”。在堆的情況下,唯一的行定位器是堆 RID。對於非唯一聚集索引,唯一行定位符是聚集索引鍵加上任何“唯一標識符”(僅用於實際重複鍵)。

索引使用統計

從查詢執行器(QE)的角度來看,索引使用統計 DMV 包含索引操作的計數。這是負責執行查詢計劃的 SQL Server 組件。

這些計數器的遞增方式並不完全直覺:

  • 每次執行計劃時,運算元計數一次。
  • 生成估計計劃不會影響總數。
  • 在單個計劃執行中執行 10,000 次的Index Seek仍然只會將使用者搜尋次數增加 1。
  • 即使根本不執行操作符,它也會被計算在內。

索引操作統計

從儲存引擎(SE)的角度來看,索引操作統計數據 DMV 包含索引和表操作的計數。

這個 DMV 計算每個儲存引擎的操作,使計數器可能更直覺:

  • 10,000 次單例查找將增加 10,000 到單例查找計數列
  • 執行 5 次的表掃描將使范圍掃描計數增加 5。

有關顯示每個計數器何時遞增的範例,請參閱我的文章Seeking without Indexes

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