简单查询的高逻辑读取
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_col
是 varchar
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。因此逻辑读取次数多
我有一个非常简单的查询,例如
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_col
是 varchar
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。因此逻辑读取次数多