Розглянемо наступні прості 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
не показує статистики вводу / виводу для таблиці темп. Однак, вставляючи в ##t1
does, показує статистику I / O для тимчасової таблиці.
SET STATISTICS IO, TIME ON;
GO
INSERT INTO #t1 (r)
SELECT r
FROM dbo.s1;
Вихід статистики:
Час розбору та компіляції SQL Server: Час процесора = 0 мс, минулий час = 1 мс. Таблиця 's1'. Кількість сканувань 1, логічне зчитування 19, фізичне зчитування 0, зчитування вперед-зчитування 0, логічне зчитування лобі 0, лобічне фізичне зчитування 0, лобічне зчитування попереднє зчитування 0. Часи виконання SQL Server: Час процесора = 16 мс, минулий час = 9 мс. (10000 рядків зачеплені)
INSERT INTO ##t1 (r)
SELECT r
FROM dbo.s1;
Час розбору та компіляції SQL Server: Час процесора = 0 мс, минулий час = 1 мс. Таблиця '## t1'. Кількість сканувань 0, логічне зчитування 10016, фізичне зчитування 0, зчитування вперед-зчитування 0, логічне зчитування лобі 0, лобічне фізичне зчитування 0, лобічне зчитування попереднє зчитування 0. Таблиця 's1'. Кількість сканувань 1, логічне зчитування 19, фізичне зчитування 0, зчитування вперед-зчитування 0, логічне зчитування лобі 0, лобічне фізичне зчитування 0, лобічне зчитування попереднє зчитування 0. Часи виконання SQL Server: Час процесора = 47 мс, минулий час = 45 мс. (10000 рядків зачеплені)
Чому в таблиці ## temp стільки читань, коли я лише вставляю в неї?