简单查询的高逻辑读取

High logical reads for a simple query

我有一个非常简单的查询,例如

select col1,col2 from table A where pk_col =1

其中 pk_col 是主键。

当我运行这个查询统计IO和时间开启时,我得到以下

(1 row affected)
Table 'A'. Scan count 1, logical reads 2948, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL 服务器执行时间: CPU time = 46 ms, elapsed time = 105 ms.

1)为什么只检索了记录,逻辑读取却如此之高?

由于 pk_colvarchar SQL 服务器需要将 pk_col 转换为 int 因为 int 具有更高的优先级:

Data type precedence (Transact-SQL)

所以查询等同于:

SELECT col1,col2 FROM table A 
where CONVERT(int, pk_col) =1

并且将列包含在函数或表达式中可以防止 SQL 服务器使用索引。因此 SQL 服务器必须扫描整个 table。因此逻辑读取次数多