考虑以下简单的MCVE:
SET STATISTICS IO, TIME OFF;
USE tempdb;
IF OBJECT_ID(N'tempdb..#t1', N'U') IS NOT NULL DROP TABLE #t1;
CREATE TABLE #t1
(
r int NOT NULL
);
IF OBJECT_ID(N'tempdb..##t1', N'U') IS NOT NULL DROP TABLE ##t1;
CREATE TABLE ##t1
(
r int NOT NULL
);
IF OBJECT_ID(N'dbo.s1', N'U') IS NOT NULL DROP TABLE dbo.s1;
CREATE TABLE dbo.s1
(
r int NOT NULL
PRIMARY KEY CLUSTERED
);
INSERT INTO dbo.s1 (r)
SELECT TOP(10000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.syscolumns sc1
CROSS JOIN sys.syscolumns sc2;
GO
当我运行以下插入时,插入到#t1
临时表不会显示任何统计信息I / O。但是,插入##t1
确实会显示临时表的统计信息I / O。
SET STATISTICS IO, TIME ON;
GO
INSERT INTO #t1 (r)
SELECT r
FROM dbo.s1;
统计信息输出:
SQL Server解析和编译时间: CPU时间= 0毫秒,经过的时间= 1毫秒。 表“ s1”。扫描计数1,逻辑读19,物理读0,预读0,lob逻辑读0,lob物理读0,lob预读0。 SQL Server执行时间: CPU时间= 16毫秒,经过时间= 9毫秒。 (受影响的10000行)
INSERT INTO ##t1 (r)
SELECT r
FROM dbo.s1;
SQL Server解析和编译时间: CPU时间= 0毫秒,经过的时间= 1毫秒。 表'## t1'。扫描计数为0,逻辑读取为10016,物理读取为0,预读为0,lob逻辑读取为0,lob物理读取为0,lob提前读取为0。 表“ s1”。扫描计数1,逻辑读19,物理读0,预读0,lob逻辑读0,lob物理读0,lob预读0。 SQL Server执行时间: CPU时间= 47毫秒,经过时间= 45毫秒。 (受影响的10000行)
当我只插入表时,为什么在## temp表上有如此多的读取?