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。

在此处输入图像描述

我不知道为什么它在第一次读取量很高以及如何减少第一次读取量。

注意:我已经执行了 DBCC DROPCLEANBUFFERS;DBCC FREEPROCCACHE;每次执行前。

4

1 回答 1

3

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

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

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

探查器

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

于 2013-08-18T15:24:23.883 回答