Рассмотрим следующий простой 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
действительно показывает статистику ввода / вывода для временной таблицы.
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 таблице так много операций чтения, когда я только вставляю в нее?
источник