[SQL SERVER][Memo]認識重新編譯臨界值

[SQL SERVER][Memo]認識重新編譯臨界值

什麼是重新編譯臨界值 ( Recompilation Threshold  (RT) )

RT其實就是SQL Server用來決定發生多少資料異動量時,

才可標示統計值過期的依據,我們可以透過sysindexes的rowmodctr欄位查看。

當資料庫開啟自動更新統計值或自動非同步更新統計值選項,

且當資料異動量也大(等)於RT值,SQL Server就會自動觸發更新統計值動作,

而這樣的處理是為了要讓查詢最佳化工具建立較佳的查詢計畫。

下面我就來實際測試自動更新統計值的行為。

 

SQL 2008對於RT的計算如下(n:資料表基數):

1. 一般資料表

If n <= 500, RT = 500

If n > 500, RT = 500 + 0.20 * n

 

create table tA
(
c1 int identity(1,1),
c2 int
)
create nonclustered index idx_1 on tA(c2) 
insert into tA values(4)

 

select * 
from tA
where c2=101

 

 

查看rowmodctr

select id,status,indid,dpages,rowcnt,rowmodctr 
from sysindexes
where id=OBJECT_ID('dbo.tA')

 

image

目前rowmodctr=1。基數(rowcnt)=1。

 

查看統計值

select * 
from sys.stats t1
where object_id=object_id('dbo.tA')

 

image

 

查看目前最佳化統計資料

DBCC SHOW_STATISTICS ("dbo.tA", 'idx_1');

 

image

索引鍵值=4。資料行值等於長條圖步驟之上限的預估資料列數=1。

 

if n<=500,RT=500,目前n=1,我新增500筆資料(>=RT)測試看看是否會觸發更新統計值

declare @i int
set @i=1
set nocount on
while(@i<=500)
begin
    insert into tA values(@i+4)
    set @i=@i+1
end

 

select * 
from tA
where c2=101

 

 

查看rowmodctr

image

rowmodctr=0。

 

查看目前最佳化統計資料

image

Rows Sampled=501。(擷取部份)

你可以看到目前最佳化統計資料的取樣筆數=501,統計值更新時間也和第一次不同。

 

If n>500, RT = 500 + 0.20 * n,我再新增500+101筆資料>=RT測試看看是否會再次觸發更新統計值

declare @i int
set @i=1
set nocount on
while(@i<=601)
begin
    insert into tA values(@i+4)
    set @i=@i+1
end
--查詢
select * 
from tA
where c2=101

 

查看rowmodctr

 

image

rowmodctr又歸0。(看來只要超過RT值,rowmodctr欄位變會歸0並重新累積計算)

 

查看目前最佳化統計資料

image

Rows Sampled=1102。(擷取部份)

果然如預期更新目前最佳化統計資料,資料取樣筆數1102。

 

現在我知道下一次觸發更新統計值的資料筆數要 > = RT=500+(0.2*1102)=720.4,

但這次我只新增700筆資料(不超過RT值),看看是否如預期不會觸發更新統計值。

declare @i int
set @i=1
set nocount on
while(@i<=700)
begin
    insert into tA values(@i+4)
    set @i=@i+1
end
--查詢
select * 
from tA
where c2=101

 

查看rowmodctr

 

image

rowmodctr=700(並未觸發自動更新統計值)。

 

查看目前最佳化統計資料

image

目前統計值筆數取樣=1102。更新時間也未改變。

 

影響rowmodctr(colmodctr)變化

陳述句 rowmodctr(colmodctr)變化
Delete n rowmodctr + n
Insert n rowmodctr  + n
Bulk Insert rowmodctr  + n (如同 Insert n)
Truncate Table rowmodctr + n (如同 Delete n)
Update n rowmodctr + n

n:筆數。

注意:rowmodctr累積計算不參予交易,假設總共新增10筆資料,其中復原5筆資料,

那麼rowmodctr累積計算依然=10,而不是5。

 

2. 暫存資料表

If n < 6, RT = 6.

If 6 <= n <= 500, RT = 500.

If n > 500, RT = 500 + 0.20 * n

 

暫存資料表有興趣的朋友可以自行測試看看。

 

3. 資料表值參數

資料表值參數並無存在統計值。

 

 

參考

DBCC SHOW_STATISTICS

Plan Caching in SQL Server 2008