Hãy xem xét các MCVE đơn giản sau:
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
Khi tôi chạy các phần chèn sau, chèn vào #t1
sẽ không hiển thị I / O cho bảng tạm thời. Tuy nhiên, việc chèn vào ##t1
sẽ hiển thị I / O thống kê cho bảng tạm thời.
SET STATISTICS IO, TIME ON;
GO
INSERT INTO #t1 (r)
SELECT r
FROM dbo.s1;
Đầu ra thống kê:
Thời gian phân tích và biên dịch SQL Server: Thời gian CPU = 0 ms, thời gian trôi qua = 1 ms. Bảng 's1'. Quét số 1, đọc logic 19, đọc vật lý 0, đọc trước đọc 0, đọc logic 0, đọc vật lý lob 0, đọc trước đọc 0, đọc trước 0. Thời gian thực thi máy chủ SQL: Thời gian CPU = 16 ms, thời gian trôi qua = 9 ms. (10000 hàng bị ảnh hưởng)
INSERT INTO ##t1 (r)
SELECT r
FROM dbo.s1;
Thời gian phân tích và biên dịch SQL Server: Thời gian CPU = 0 ms, thời gian trôi qua = 1 ms. Bảng '## t1'. Quét số 0, đọc logic 10016, đọc vật lý 0, đọc trước đọc 0, đọc logic 0, đọc vật lý lob 0, đọc trước đọc 0, đọc trước 0. Bảng 's1'. Quét số 1, đọc logic 19, đọc vật lý 0, đọc trước đọc 0, đọc logic 0, đọc vật lý lob 0, đọc trước đọc 0, đọc trước 0. Thời gian thực thi máy chủ SQL: Thời gian CPU = 47 ms, thời gian trôi qua = 45 ms. (10000 hàng bị ảnh hưởng)
Tại sao có quá nhiều lượt đọc trên bảng ## temp khi tôi chỉ chèn vào nó?