Sql-Server

大表上的多列統計資訊產生較差的估計

  • February 7, 2014

我有一個相當大的表(約 2 億行),雖然統計資訊是最新WITH FULLSCAN的,是不是已經不夠“選擇性”了?對於這個特定客戶的數據庫/表,與其他人相比,我的查詢計劃估計值相差甚遠。

我關心的特定統計數據來自表的 PK/CLUSTERED INDEX。int它是一個包含( ParentId) 和smalldatetime( )的多列統計資訊TimeStamp

當我發出 aDBCC SHOW_STATISTICS('SomeTable', 'PK_SomeTable')時,我得到以下輸出(直方圖省略 - 但如果有幫助,我可以發布它):

Name                    Updated              Rows       Rows Sampled    Steps   Density         Average key length  String Index    Filter Expression   Unfiltered Rows
PK_SomeTable            Jan 31 2014 10:59AM  181170887  181170887       200     2.022617E-05    8                   NO              NULL                181170887

All density     Average Length  Columns
0.0004892368    4               ParentId
5.519651E-09    8               ParentId, TimeStamp

我的大部分查詢都是使用這兩個列(ParentIdTimeStamp)的組合來執行的。小的全密度值顯示了這對的選擇性 - 顯然因為它是 PK。

(1) 直方圖似乎只顯示ParentId列。我在這裡錯過了什麼嗎?兩列都被考慮了嗎?

(2) 如果我採用 200,000,000 行 / 200 步,我基本上在每個直方圖步中定義了 1,000,000 行。這似乎足夠大,可能會導致估計問題,對吧?排序溢出到 tempdb 之類的東西呢?

(3) 手動創建的統計數據/過濾的統計數據會成為探索的途徑嗎?如何決定應用哪種類型的過濾器?

對於這麼大的表,我會考慮分區。不幸的是,我無法回答您的具體問題 (1-3),但總的來說,使用分區視圖(而不是本機分區)的好處之一是分區視圖中的各個表被視為單獨的對象,並且每個表都有自己的統計資訊有 200 步。 是一篇文章,其中 SQLSkills 的 Kimberly Tripp 建議您不僅要考慮分區或分區視圖,還要考慮將兩者結合起來的大型表。

如果您不知道分區視圖是一個分區視圖,其中您有多個表,每個表都包含一部分數據,並且頂部的視圖與 UNION ALL 將表組合在一起。

如果您有興趣,這裡是 Kimberly 的另一個關於統計的部落格。 它應該可以幫助您回答一些其他問題。

這是康納坎寧安關於統計的文章:統計、該死的謊言和統計——什麼是 Statman?

我的客戶的表超過 2B 行,並且可以使用統計資訊來生成良好的執行計劃。只有幾億行的表應該沒有問題。

如果您確實需要有關表格的更多統計資訊,您可以將過濾後的統計資訊放在表格上,根據需要按年份或月份過濾,以便您可以獲得更多數據進行優化。但這需要您手動更新統計資訊。

對於您現在擁有的大量統計數據,我建議您打開跟踪標誌 2371 。這樣,統計資訊會更頻繁地更新。您還需要打開非同步統計更新

您是否看到使用此統計資訊的查詢存在特定的性能問題?

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