พิจารณา 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 ms, เวลาที่ผ่านไป = 1 ms ตาราง 's1' จำนวนการสแกน 1, การอ่านเชิงตรรกะ 19, การอ่านทางกายภาพ 0, การอ่านล่วงหน้าอ่าน 0, lob ตรรกะอ่าน 0, lob การอ่านทางกายภาพ 0, lob การอ่านล่วงหน้าอ่าน 0 เวลาดำเนินการของ SQL Server: เวลา CPU = 16 ms, เวลาที่ผ่านไป = 9 ms (ได้รับผลกระทบ 10,000 แถว)
INSERT INTO ##t1 (r)
SELECT r
FROM dbo.s1;
SQL Server แยกวิเคราะห์และรวบรวมเวลา: เวลา CPU = 0 ms, เวลาที่ผ่านไป = 1 ms ตาราง '## t1' จำนวนการสแกน 0, อ่านโลจิคัล 10016, อ่านฟิสิคัล 0, อ่านล่วงหน้าอ่าน 0, โลปลอจิกอ่าน 0, lob ฟิสิคัลอ่าน 0, lob อ่านล่วงหน้าอ่าน 0 ตาราง 's1' จำนวนการสแกน 1, การอ่านเชิงตรรกะ 19, การอ่านทางกายภาพ 0, การอ่านล่วงหน้าอ่าน 0, lob ตรรกะอ่าน 0, lob การอ่านทางกายภาพ 0, lob การอ่านล่วงหน้าอ่าน 0 เวลาดำเนินการของ SQL Server: เวลา CPU = 47 ms, เวลาที่ผ่านไป = 45 ms (ได้รับผลกระทบ 10,000 แถว)
เหตุใดจึงมีการอ่านจำนวนมากบนตาราง ## temp เมื่อฉันใส่เท่านั้น?