2013-08-18 47 views
3

我已經創建了下面的表,並通過執行下面的語句插入20K記錄:爲什麼剖析器在第一次執行時總是讀取更高的值,以及如何降低它?

create table Testing 
(
col1 int, 
col2 varchar(50), 
col3 bit, 
col4 int, 
col5 varchar(50), 
col6 bit); 

declare 
@flag bit = 1, 
@count int 

while @flag = 1 
    begin 
     set @count = (Select count(*) from Testing); 
     if (@count = 20000) 
      begin 
       set @flag = 0; 
      end 
     else 
      begin 
       insert into Testing values(100, 'Testing', 1, 100, 'Testing', 1) 
      end 
    end 

然後執行下面的查詢的6倍:

select * from testing 
where col2 = 'Testing' 

探查顯示276讀取用於第一執行其餘五個人則爲135人。

enter image description here

我不知道爲什麼它採取高讀取第一次,如何降低讀取首次。

注:我執行了DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;在每次執行之前。

+0

第一次必須從磁盤讀取頁面。如果您在col2上有索引,您可能會獲得更好的結果。檢查執行計劃。 – rene

+0

我在每次執行前都清除了緩衝區和緩存。 – Prakash

+0

我不是100%確定的,但我認爲如果你把它作爲一個存儲過程,它可能會在第一次被命中時更快。我認爲執行計劃是兌現或類似的。 –

回答

3

我在這裏看到類似的模式。在我的情況下,第一批顯示爲226次讀取,後續讀數爲105.

第一次在創建並填充表後執行查詢時,它會自動創建col2的統計信息以獲取估計的行數。

如果將SP:StmtCompleted事件添加到跟蹤中,您可以看到這是第一批遇到的額外讀取的責任。

Profiler

要回答這個問題:「如何降低讀取的第一次?」從技術上講,您可以禁用自動統計信息創建,但您不應該這樣做自動統計信息維護的開銷通常與更精確的基數估計和更好的查詢計劃的收益相比毫無用處。

+0

@Prakash - 與時間無關。當你第一次用where子句在那個表上運行一個查詢時,例如'where col2 ='Testing'',SQL Server沒有找到任何統計信息,它會自動在該列上創建統計信息。根據列值的更改次數,它們也會自動更新。有關自動更新的更多信息,請參閱舊的統計信息部分[此處](http://technet.microsoft.com/zh-cn/library/cc293623.aspx)。 –

+0

我不想禁用自動統計創建。但我正在尋求一種儘可能減少讀數的方法。 – Prakash

+1

@Prakash - 爲什麼?作爲一個目標本身,這是毫無意義的。你現在明白是什麼造成了他們。你有沒有證據證明他們造成了問題?如果你想在問題中優化特定的查詢,一般來說你可以添加一個索引,但是在這種情況下,100%的行不匹配。 –

相關問題