sql - 为什么探查器在第一次执行时总是读取更高以及如何降低它?

标签 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;每次执行前。

最佳答案

我在这里看到了类似的模式。在我的例子中,第一批显示为 226 个读数,后续读数为 105 个。

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

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

Profiler

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

关于sql - 为什么探查器在第一次执行时总是读取更高以及如何降低它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299734/

相关文章:

sql - 访问 View 中子查询中的值

sql-server - SQL 帐户是否会降低 MS SQL Server 2008 的安全性

c# - 使用 WCF 服务从 CMS 获取数据的 Asp.Net Webforms 应用程序的性能

php - 链接数据库中的 2 个表

sql - 有很多条件

SQL Server - 缺少 NATURAL JOIN/x JOIN y USING(字段)

sql-server - 使用 Filestream 是个好主意吗?

sql - 我可以用 View (同名)替换表吗?

c# - 使用空值连接表

sql - T-SQL [UNION ALL] 从查询结果中删除记录