1

使用的查询:

(从网上某处复制了缓存清理代码)

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO
DBCC DROPCLEANBUFFERS
GO

SET STATISTICS TIME ON;
SET STATISTICS IO ON;

select a.a,a.b from t1 a JOIN t1 b on a.i=b.i

t1 的架构是

CREATE TABLE [dbo].[t1](
    [i] [int] NULL,
    [a] [varchar](1000) NULL,
    [b] [varchar](1000) NULL,
    [c] [varchar](1000) NULL
) ON [PRIMARY]

并且 t1 填充了随机数据(I范围从 0-11 和 a,b,c 填充了NEWID()值)

它包含大约 900 行(准确地说是 934 行)

执行查询的结果是:

SQL Server 解析和编译时间:CPU 时间 = 0 毫秒,运行时间 = 0 毫秒。

SQL Server 执行时间:CPU 时间 = 0 毫秒,经过时间 = 55 毫秒。SQL Server 解析和编译时间:CPU 时间 = 0 毫秒,运行时间 = 0 毫秒。DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。

SQL Server 执行时间:CPU 时间 = 0 毫秒,经过时间 = 4 毫秒。SQL Server 解析和编译时间:CPU 时间 = 0 毫秒,运行时间 = 0 毫秒。DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。

SQL Server 执行时间:CPU 时间 = 0 毫秒,经过时间 = 1 毫秒。SQL Server 解析和编译时间:CPU 时间 = 0 毫秒,运行时间 = 0 毫秒。

SQL Server 执行时间:CPU 时间 = 0 毫秒,经过时间 = 0 毫秒。

SQL Server 执行时间:CPU 时间 = 0 毫秒,经过时间 = 0 毫秒。

(受影响的 115974 行)表“工作表”。扫描计数 0,逻辑读取 0,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表 't1'。扫描计数 2,逻辑读取 32,物理读取 0,预读读取 20,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。

SQL Server 执行时间:CPU 时间 = 79 毫秒,经过时间 = 15858 毫秒。

据我了解,干净的缓存应该会导致大量物理读取,不是吗?

(SQL Server 2012 在 Win 8 主机上的 Hyper V 上运行的 Win 8 来宾 VM 上运行)

4

1 回答 1

2

您突出显示的项目是针对在查询过程中Worktable创建的(例如线轴) 。tempdb不是需要从磁盘读取的预先存在的表。

t1应该显示一些物理读取和/或预读读取。

(编辑:没有看到最初包含在内)。下面显示了 20 次预读t1

Table 't1'. Scan count 2, logical reads 32, physical reads 0, read-ahead reads 20

这意味着所有页面都通过预读机制进入缓存。

于 2012-11-09T11:45:51.957 回答