Sql-Server

由於連接了 2 個良好估計的結果,如何更正行估計

  • October 30, 2021

以下查詢在大約 60 個數據庫中並行執行。在沒有提示的情況下,至少 10% 的數據庫中存在大量洩漏和非最佳計劃。

使用更大的數據庫作為指導,查詢被鎖定並帶有提示(在 1 個 CPU 上約 75 毫秒)以減少執行時的差異,因為 1 個錯誤的計劃會導致整個執行時終止。我們主要反對讓每個 DB 自由調整其計劃,因為從長遠來看,某些 DB 可能會在生產平台上著火。我們對大型數據庫的近乎最佳計劃感到非常滿意,而小型數據庫可能不是最佳計劃。

即使在添加了帶全掃描的統計資訊後,一些(約 5 個)較小的數據庫仍然表現出小的 1 級溢出(參見計劃)。執行時間仍然可以(125 毫秒),但希望消除溢出。

這是 Sql Server 2019。自適應授權功能(2017)是否應該因溢出而調整授權?在 SSMS 和查看計劃中重複執行它似乎表明沒有變化。

select top (@pMax)
          aig.ObjectId,  
          iif((@pA in (1, 2, 3, 4, 5, 6, 9, 11, 12) and ttm.ObjectId is not null) or
              (@pA in (7, 8, 10, 13, 14, 15)), 1.0, 0.0) as Rank
     from oav.value aig               
     inner merge join Pub.CachedObjectHierarchyAttributes coha
       on coha.ObjectId = aig.ObjectId
      and coha.IsActiveForPublisher = 1
      and coha.IsToolItem = 1
     inner merge join Oav.ValueArray v897
       on v897.PropertyId = 897
      and v897.ObjectId = aig.ObjectId
      and v897.[Value] = @pBrandId
     left hash join oav.valuearray ttm      
       on ttm.ObjectId = aig.ObjectId
      and ttm.PropertyId = 11131  
      and ttm.[Value] = @pToolTypeMapId 
    where aig.PropertyId = 2573        
      and aig.[Value] = @pA
    order by ttm.[Value] desc -- to put TTM matches at the top
    option (maxdop 1); -- limit to 1 cpu since it runs across all pubs

來自 3 個索引的行估計在小於實際行的 1% 內尋找正確匹配。

在此處輸入圖像描述

然而,對最右邊的 2 個搜尋的第一次合併的估計值偏離了很多,然後通過導致溢出。有了前兩個階段的完美估計,還有什麼影響這個估計?

在此處輸入圖像描述

玩零售:

在此處輸入圖像描述

如果您已經在向查詢添加大量提示並且不想讓 SQL Server 在這種情況下做出選擇,那麼我傾向於添加MIN_GRANT_PERCENT提示以消除溢出。查詢計劃只有兩個消耗記憶體的操作,因此這種類型的提示可能在這裡有效。

目前的記憶體授予看起來很小——也許是 3 MB?改為 30 MB 不太可能導致問題,對吧?在某些情況下,跟踪和解決此類基數估計問題可能需要數小時。您甚至可能需要數小時來收集和匿名化某人嘗試回答您提出的問題所需的所有資訊。真的值得花時間去做嗎?

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