歡迎來到效能調優培訓的第4個月。這個月全是關於sql server裡的統計資訊,還有它們如何幫助查詢優化器生成足夠好的執行計畫。統計資訊主要是被查詢優化器用來估計查詢返回的行數。它只是個估計,沒別的。
sql server使用在統計資訊物件裡稱作直方圖(histogram)的東西,它描述了對於所給列最大200步長(steps)的資料分布情況。最大的侷限性之一,對於sql server裡的統計資訊是200步長的侷限性(使用過濾統計資訊可以超過這個步長,這在sql server 2008裡就引入了)。
另外的侷限性是統計資訊的自動更新(auto update)機制:對於大於500行的表,如果500+20%的列值發生改變,統計資訊才會更新。這就意味著,一旦表增長,你的統計資訊的自動更新頻率將越少(每次觸發自動更新需要更多的記錄修改)。
當你的執行計畫裡保航書籤查詢時,這個行為就會是巨大的問題。正如你知道的,基於當前的統計資訊,如果查詢的估計行數是非常少的,查詢優化器才會選擇書籤查詢運算子。如果你的統計資訊過期,你的執行計畫還是有效的話,sql server就會盲目重用快取計畫,你的頁讀取就會暴漲。我們來看看這個問題的具體例子。
下面的指令碼會建立有1500條記錄的表,在column2列有平均的資料分布。另外我們在column2列上定義非聚集索引。
1當你對錶進行簡單的select * 查詢時,你會得到帶有書籤查詢運算子的執行計畫:create
table
table12(
3 column1 int
identity
,4 column2 int5)
6go78
--insert 1500 records into table1
9select
top1500
identity(int, 1, 1) as n into
#nums
10from
11master.dbo.syscolumns sc1
1213
insert
into
table1 (column2)
14select n from
#nums
1516
drop
table
#nums
17go
1819
create
nonclustered
index idx_table1_colum2 on
table1(column2)
20go
從索引查詢(non clustered)運算子可以看到,sql server估計行數是1(估計行數(estimated number of rows)屬性),實際上sql server也處理1條記錄(實際行數(actual number of rows)屬性)。這就是說,我們這裡用到的統計資訊是準確的,查詢本身產生3個邏輯讀。
我們現在的表有1500條記錄,因此當20% + 500條記錄發生改變時,sql server會自動更新非聚集索引的統計資訊。算一下,我們需要修改800條資料(1500 * 20% + 500)。
接下來我們對錶做如下處理:我們對sql server做一點動作,只插入799條新記錄。但799條記錄的第2列值都是2。這就是說我們完全改變第2列的平均資料分布。統計資訊會認為只有1條第2列值為2的記錄返回,但實際上卻有800條記錄返回(1條已存在的,799條新插入的):
1現在我們來執行下列查詢語句,找第2列值為2的記錄,並開啟執行計畫顯示和io統計。select
top799
identity(int, 1, 1) as n into
#nums
2from
3master.dbo.syscolumns sc145
insert
into
table1 (column2)
6select
2from
#nums78
drop
table
#nums
9go
1sql server重用了有書籤查詢的執行計畫。這就是說執行計畫裡的書籤查詢執行了1500次——一次性對所有記錄!這會耗費大量的邏輯讀——sql server這裡報告了806個頁讀取。setstatistics io on
2select
*from dbo.table1 where column2 ='2
'
從圖中可以看到,實際行數(actual number of rows)現在已經遠遠超過了估計行數(estimated number of rows)。
sql server裡
失真的統計資訊就會帶來這樣的問題。
今天的效能調優培訓我給你簡單介紹了sql server裡的統計資訊。如你所見,失真的統計資訊,對於快取的,重用的執行計畫會帶來嚴重的效能問題。
0817_13統計資訊.rar
4周資訊 按照 周 星期 統計查詢
if object id tempdb.temp is not null 臨時表存在則刪除 begin drop table temp endcreate table temp 建立臨時表 id int identity primary key,columnname varchar 100 week...
mysql統計資訊 概述MySQL統計資訊
mysql統計資訊的儲存分為兩種,非持久化和持久化統計資訊。一 非持久化統計資訊 非持久化統計資訊儲存在記憶體裡,如果資料庫重啟,統計資訊將丟失。有兩種方式可以設定為非持久化統計資訊 1 全域性變數,innodb stats persistent off 2 create alter表的引數,sta...
票統計(C程式設計高階第2周)
問題描述 有乙個小型的報賬系統,它有如下功能 1 統計每個人所報發票的總錢數 2 統計每類發票的總錢數 將此系統簡化為如下 假設發票類別共有a b c三種 一共有三個人,id分別為1 2 3。輸入 系統輸入包含三行,每行第乙個數為人員id 整型,1或2或3 第二個數為發票總張數 張數不超過100 之...