다음과 같은 간단한 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가 표시되지 않습니다. 그러나에 삽입 하면 임시 테이블에 대한 통계 I / O ##t1
가 표시됩니다.
SET STATISTICS IO, TIME ON;
GO
INSERT INTO #t1 (r)
SELECT r
FROM dbo.s1;
통계 출력 :
SQL Server 구문 분석 및 컴파일 시간 : CPU 시간 = 0ms, 경과 시간 = 1ms 테이블 's1'. 스캔 카운트 1, 논리적 읽기 19, 물리적 읽기 0, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0. SQL Server 실행 시간 : CPU 시간 = 16ms, 경과 시간 = 9ms (10000 개의 행이 영향을 받음)
INSERT INTO ##t1 (r)
SELECT r
FROM dbo.s1;
SQL Server 구문 분석 및 컴파일 시간 : CPU 시간 = 0ms, 경과 시간 = 1ms 테이블 '## 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 시간 = 47ms, 경과 시간 = 45ms (10000 개의 행이 영향을 받음)
삽입 할 때 ## temp 테이블에 너무 많은 읽기가있는 이유는 무엇입니까?