我创建了下表并通过执行以下语句插入了 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;每次执行前。
最佳答案
我在这里看到了类似的模式。在我的例子中,第一批显示为 226 个读数,后续读数为 105 个。
在创建和填充表后第一次执行查询时,它会自动在 col2
上创建统计信息,以获得估计的行数。
如果将 SP:StmtCompleted
事件添加到跟踪中,您会发现这是造成第一批遇到的额外读取的原因。
回答“第一次如何减少reads?”这个问题从技术上讲,您可以禁用自动统计信息创建,但您不应该这样做与更准确的基数估计和更好的查询计划的好处相比,自动统计信息维护的开销通常是微不足道的。
关于sql - 为什么探查器在第一次执行时总是读取更高以及如何降低它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299734/