大表上的多列統計資訊產生較差的估計
我有一個相當大的表(約 2 億行),雖然統計資訊是最新
WITH FULLSCAN
的,是不是已經不夠“選擇性”了?對於這個特定客戶的數據庫/表,與其他人相比,我的查詢計劃估計值相差甚遠。我關心的特定統計數據來自表的 PK/CLUSTERED INDEX。
int
它是一個包含(ParentId
) 和smalldatetime
( )的多列統計資訊TimeStamp
。當我發出 a
DBCC 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
我的大部分查詢都是使用這兩個列(
ParentId
和TimeStamp
)的組合來執行的。小的全密度值顯示了這對的選擇性 - 顯然因為它是 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 。這樣,統計資訊會更頻繁地更新。您還需要打開非同步統計更新。
您是否看到使用此統計資訊的查詢存在特定的性能問題?