第13 24周 統計資訊

2021-09-07 00:07:14 字數 2994 閱讀 4658

歡迎來到效能調優培訓的第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

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

當你對錶進行簡單的select * 查詢時,你會得到帶有書籤查詢運算子的執行計畫:

索引查詢(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

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

現在我們來執行下列查詢語句,找第2列值為2的記錄,並開啟執行計畫顯示和io統計。

1

setstatistics io on

2select

*from dbo.table1 where column2 ='2

'

sql server重用了有書籤查詢的執行計畫。這就是說執行計畫裡的書籤查詢執行了1500次——一次性對所有記錄!這會耗費大量的邏輯讀——sql server這裡報告了806個頁讀取。

從圖中可以看到,實際行數(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 之...