我创建了下表并通过执行以下语句插入了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;在每次执行之前。
答案 0 :(得分:3)
我在这里看到了类似的模式。在我的情况下,第一批显示为226读取,后续读取显示为105。
首次在创建和填充表格后执行查询时,它会自动在col2
上创建统计信息,以获得估计的行数。
如果将SP:StmtCompleted
事件添加到跟踪中,您可以看到这是第一批遇到的额外读取的原因。
回答“如何首次减少读数?”的问题。从技术上讲,您可以禁用自动统计信息创建,但您不应该这样做与更准确的基数估算和更好的查询计划的好处相比,自动统计维护的开销通常没什么用。