Sql-Server

統計直方圖 AVG_RANGE_ROWS 差異

  • September 28, 2020

根據 MS docs,描述為AVG_RANGE_ROWS

直方圖步驟中具有重複列值的平均行數,不包括上限。當 DISTINCT_RANGE_ROWS 大於 0 時,通過將 RANGE_ROWS 除以 DISTINCT_RANGE_ROWS 來計算 AVG_RANGE_ROWS。當 DISTINCT_RANGE_ROWS 為 0 時,AVG_RANGE_ROWS 為直方圖步驟返回 1。

我正在查看最後一行,如果確實如此,我很想知道為什麼我在直方圖步驟中看到的值AVG_RANGE_ROWS不等於1when DISTINCT_RANGE_ROWSis 。0

stats_histogram

有問題的統計資訊是 SQL Server 在自動創建統計資訊選項打開時創建的列統計資訊。我使用的是舊版本的數據庫,但使用的是最新更新檔 - SQL Server 2014 SP3、CU4+GDR (12.0.6372.1)。

有點不幸的是,上週我們幾乎因為一個次優的查詢計劃而崩潰。最終結果是大掃描和臃腫的記憶體授權。用更高的百分比值重新採樣統計數據暫時為我們解決了這個問題,但我很想知道初始語句周圍是否有異常或已知問題(可能使用跟踪標誌解決?)以及如何對於我們無法控制採樣大小的自動創建的統計數據,我是否可以防止這種情況再次發生?

正如對錯誤形成的直方圖導致對嵌套循環的錯誤估計的回答中所述,計算和儲存采樣統計資訊的方式發生了變化,尤其是在應用縮放時。

作為副作用,DISTINCT_RANGE_ROWS在您的情況下,值是 0 到 1 之間的分數(980.235 / 386212.6 = 0.002538071)。該列的公開類型為bigint,因此它向下舍入為零。

顯然,當範圍包含非零行數時,實際上不可能有零不同值。

只能希望這些差異在某個階段得到消除;雖然很難想像如果沒有數據類型的潛在破壞性更改會是什麼樣子,也擴展到sys.dm_db_stats_histogram(在 SQL Server 2016 及更高版本上可用)。

至於你對此做了什麼,如果你確信這不僅僅是一個顯示問題,而且實際上導致了糟糕的估計,你應該將其報告為回歸。

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