Atitit sql计划任务与查询优化器--统计信息模块
Atitit sql計劃任務(wù)與查詢優(yōu)化器--統(tǒng)計信息模塊
?
?
每一個統(tǒng)計信息的內(nèi)容都包含以上三部分的內(nèi)容。
我們依次來分析下,通過這三部分內(nèi)容SQL Server如何了解該列數(shù)據(jù)的內(nèi)容分布的。
a、統(tǒng)計信息的總體屬性項
該部分包含以下幾列:
·?Name:統(tǒng)計信息的名稱。
·?Updated:統(tǒng)計信息的最近一次更新時間,這個時間信息很重要,根據(jù)它我們能知道該統(tǒng)計信息什么時候更新的,是不是最新的,是不是存在統(tǒng)計信息更新不及時造成統(tǒng)計的當(dāng)前數(shù)據(jù)分布不準(zhǔn)確等問題。
·?Rows:描述當(dāng)前表中的總行數(shù)。
·?Rows Sampled:統(tǒng)計信息的抽樣數(shù)據(jù)。當(dāng)數(shù)據(jù)量比較多的時候,統(tǒng)計信息的獲取是采用的抽樣的方式統(tǒng)計的,如果數(shù)據(jù)量比較就會通過掃描全部獲取比較精確的統(tǒng)計值。比如,上面的例子中抽樣數(shù)據(jù)就為91行。
·?Steps:步長值。也就是SQL Server統(tǒng)計信息的根據(jù)數(shù)據(jù)行的分組的個數(shù)。這個步長值也是有SQL Server自己確定的,因為步長越小,描述的數(shù)據(jù)越詳細(xì),但是消耗也越多,所以SQL Server會自己平衡這個值。
·?Density:密度值,也就是列值前綴的大小。
·?Average Key length:所有列的平均長度。
·?String Index:表示統(tǒng)計值是否為字符串的統(tǒng)計信息。這里字符串的評估目的是為了支持LIKE關(guān)鍵字的搜索。
·?Filter Expression:過濾表達(dá)式,這個是SQL Server2008以后版本的新特性,支持添加過濾表達(dá)式,更加細(xì)粒度進(jìn)行統(tǒng)計分析。
·?Unfiltered Rows:沒有經(jīng)過表達(dá)式過濾的行,也是新特性。
經(jīng)過上面部分的數(shù)據(jù),統(tǒng)計信息已經(jīng)分析出該列數(shù)據(jù)的最近更新時間、數(shù)據(jù)量、數(shù)據(jù)長度、數(shù)據(jù)類型等信息值。
?
b、統(tǒng)計信息的覆蓋索引項
All density:反映索引列的稠密度值。這是一個非常重要的值,SQL Server會根據(jù)這個評分項來決定該索引的有效程度。
該分值的計算公式為:density=1/表中非重復(fù)的行數(shù)。所以該稠密度值取值范圍為:0-1。
該值越小說明該列的索引項選擇性更強,也就說該索引更有效。理想的情況是全部為非重復(fù)值,也就是說都是唯一值,這樣它的數(shù)最小。
舉個例子:比如上面的例子該列存在91行,假如顧客不存在重名的情況下,那么該密度值就為1/91=0.010989,該列為性別列,那么它只存在兩個值:男、女,那么該列的密度值就為0.5,所以相比而言SQL Server在索引選擇的時候很顯然就會選擇ContactName(顧客名字)列。
簡單點講:就是當(dāng)前索引的選擇性高,它的稠密度值就小,那么它就重復(fù)值少,這樣篩選的時候更容易找到結(jié)果值。相反,重復(fù)值多選擇性就差,比如性別,一次過濾只能過濾掉一半的記錄。
Average Length:索引的平均長度。
Columns:索引列的名稱。這里因為我們是非聚集索引,所以會存在兩行,一行為ContactName索引列,一行為ContactName索引列和聚集索引的列值CustomerID組合列。希望能明白這里,索引基礎(chǔ)知識。
通過以上部分信息,SQL Server會知道該部分的數(shù)據(jù)獲取方式那個更快,更有效。
?
c、統(tǒng)計信息的直方圖信息
我們接著分析第三部分,該列直方圖信息,通過這塊SQL Server能直觀“掌控”該列的數(shù)據(jù)分布內(nèi)容,我們來看
·?RANGE_HI_KEY:直方圖中每一組數(shù)據(jù)的最大值。這個好理解,如果數(shù)據(jù)量大的話,經(jīng)過分組,這個值就是當(dāng)前組的最大值。上面例子的統(tǒng)計信息總共分了90組,總共才91行,也就是說,SQL Server為了準(zhǔn)確的描述該列的值,大部分每個組只取了一個值,只有一個組取了倆值。
·?RANGE_ROWS:直方圖的沒組數(shù)據(jù)的區(qū)間行數(shù)(不包括最大值)。這里我們說了總共就91行,它分了90組,所以有一組會存在兩個值,我們找到它:
·?EQ_ROWS:這里表示和上面最大值相等的行數(shù)目。因為我們不包含一樣的,所以這里值都為 1
·?DISTINCT_RANGE_ROWS:直方圖每組數(shù)據(jù)區(qū)間的非重復(fù)值的數(shù)目。上限值除外。
·?AVG_RANGE_ROWS:每個直方圖平均的行數(shù)。
經(jīng)過最后一部分的描述,SQL Server已經(jīng)完全掌控了該表中該字段的數(shù)據(jù)內(nèi)容分布了。想獲取那些數(shù)據(jù)根據(jù)它就可以從容獲取到,并且統(tǒng)計信息是排序了的。
所以當(dāng)我們每次寫的T-SQL語句,它都能根據(jù)統(tǒng)計信息評估出要獲取的數(shù)據(jù)量多少,并且找到最合適的執(zhí)行計劃來執(zhí)行。
我也相信經(jīng)過上面三部分的分析,關(guān)于文章開篇我們提到的那個關(guān)于‘K’和‘Y’的問題會找到答案了,這里不解釋了。
當(dāng)然,如果數(shù)據(jù)量特別大,統(tǒng)計信息的維護(hù)也會有小小的失誤,而這時候就需要我們來站出來及時的彌補。
創(chuàng)建統(tǒng)計信息
通過上面的介紹,其實我們已經(jīng)看到了統(tǒng)計信息的強大作用了,所以對于數(shù)據(jù)庫來說它的重要性就不言而喻了,因此,SQL Server會自動的創(chuàng)建統(tǒng)計信息,適時的更新統(tǒng)計信息,當(dāng)然我們可以關(guān)閉掉,但是我非常不建議這么做,原因很簡單:No?Do? No Die...
這兩項功能默認(rèn)是開啟的,也就是說SQL Server會自己維護(hù)統(tǒng)計信息的準(zhǔn)確性。
在日常維護(hù)中,我們大可不必要去更改這兩項,當(dāng)然也有比較極端的情況,因為我們知道更新統(tǒng)計信息也是一個消耗,在非常的大的并發(fā)的系統(tǒng)中需要關(guān)掉自動更新功能,這種情況非常的少之又少,所以基本采用默認(rèn)值就可以。
在以下情況下,SQL Server會自動的創(chuàng)建統(tǒng)計信息:
1、在索引創(chuàng)建時,SQL Server會自動的在索引列上創(chuàng)建統(tǒng)計信息。
2、當(dāng)SQL Server想要使用某些列上的統(tǒng)計信息,發(fā)現(xiàn)沒有的時候,這時候會自動創(chuàng)建統(tǒng)計信息。
3、當(dāng)然,我們也可以手動創(chuàng)建。
比如,自動創(chuàng)建的例子
select?* into CustomersStats from?Customers
sp_helpstats CustomersStats
?
來添加一個查詢語句,然后再查看統(tǒng)計信息
select?* from?CustomersStatswhere?ContactName='Hanna Moos'
go
sp_helpstats CustomersStats
go
在以下情況下,SQL Server會自動的更新統(tǒng)計信息:
?1、如果統(tǒng)計信息是定義在普通的表格上,那么當(dāng)發(fā)生以下任一種的變化后,統(tǒng)計信息就會被觸發(fā)更新動作。
·?表格從沒有數(shù)據(jù)變成大于等于1條數(shù)據(jù)。
·?對于數(shù)據(jù)量小于500行的表格,當(dāng)統(tǒng)計信息的第一個字段數(shù)據(jù)累計變化大于500以后。
·?對于數(shù)據(jù)量大于500行的表格,當(dāng)統(tǒng)計信息的第一個字段數(shù)據(jù)累計變化大于500+(20%*表格總的數(shù)據(jù)量)以后。所以對于較大的表,只有1/5以上的數(shù)據(jù)發(fā)生變化后,SQL Server才會重新計算統(tǒng)計信息。
2、臨時表上也可以有統(tǒng)計信息。這也是很多情況下采用臨時表優(yōu)化的原因之一。其維護(hù)策略基本和普通表格一樣,但是表變量不能創(chuàng)建統(tǒng)計信息。
當(dāng)然,我們也可以手動的更新統(tǒng)計信息,更新腳本如下:
UPDATE STATISTICS Customers WITH FULLSCAN
?
?
?
?
SQL Server調(diào)優(yōu)系列進(jìn)階篇(深入剖析統(tǒng)計信息) - 指尖流淌 - 博客園.html
?
作者::?綽號:老哇的爪子claw?of Eagle?偶像破壞者Iconoclast?image-smasher
捕鳥王"Bird?Catcher?王中之王King of Kings 虔誠者Pious?宗教信仰捍衛(wèi)者?Defender?of?the?Faith.?卡拉卡拉紅斗篷?Caracalla?red cloak
簡稱::?Emir Attilax?Akbar?埃米爾?阿提拉克斯?阿克巴
全名::Emir Attilax?Akbar?bin Mahmud?bin ?attila bin Solomon?Al?Rapanui?
埃米爾 阿提拉克斯?阿克巴?本 馬哈茂德?本?阿提拉 本 所羅門??阿爾?拉帕努伊???
常用名:艾提拉(艾龍),???EMAIL:1466519819@qq.com
轉(zhuǎn)載請注明來源:attilax的專欄 ??http://www.cnblogs.com/attilax/
--Atiend
?
總結(jié)
以上是生活随笔為你收集整理的Atitit sql计划任务与查询优化器--统计信息模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 说说程序员、编译器、CPU之间的三角恋
- 下一篇: 一天一个Linux基础命令之复制文件或目