統計直方圖 AVG_RANGE_ROWS 差異
根據 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
不等於1
whenDISTINCT_RANGE_ROWS
is 。0
有問題的統計資訊是 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 及更高版本上可用)。至於你對此做了什麼,如果你確信這不僅僅是一個顯示問題,而且實際上導致了糟糕的估計,你應該將其報告為回歸。