为什么profiler在首次执行时读取总是更高,以及如何减少它?

时间:2013-08-18 13:44:32

标签: sql sql-server sql-server-2008 profiler

我创建了下表并通过执行以下语句插入了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;在每次执行之前。

1 个答案:

答案 0 :(得分:3)

我在这里看到了类似的模式。在我的情况下,第一批显示为226读取,后续读取显示为105。

首次在创建和填充表格后执行查询时,它会自动在col2上创建统计信息,以获得估计的行数。

如果将SP:StmtCompleted事件添加到跟踪中,您可以看到这是第一批遇到的额外读取的原因。

Profiler

回答“如何首次减少读数?”的问题。从技术上讲,您可以禁用自动统计信息创建,但您不应该这样做与更准确的基数估算和更好的查询计划的好处相比,自动统计维护的开销通常没什么用。