Considere o seguinte MCVE simples:
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
Quando executo as seguintes inserções, a inserção em #t1
não mostra E / S de estatísticas para a tabela temporária. No entanto, a inserção em ##t1
faz mostrar estatísticas de I / O para a tabela de temperatura.
SET STATISTICS IO, TIME ON;
GO
INSERT INTO #t1 (r)
SELECT r
FROM dbo.s1;
A saída de estatísticas:
Tempo de análise e compilação do SQL Server: Tempo de CPU = 0 ms, tempo decorrido = 1 ms. Tabela 's1'. Contagem de varredura 1, leituras lógicas 19, leituras físicas 0, leituras antecipadas 0, leituras lógicas lob 0, leituras lógicas lob 0, leituras físicas lob 0, leituras antecipadas lob. Tempos de execução do SQL Server: Tempo de CPU = 16 ms, tempo decorrido = 9 ms. (10000 linhas afetadas)
INSERT INTO ##t1 (r)
SELECT r
FROM dbo.s1;
Tempo de análise e compilação do SQL Server: Tempo de CPU = 0 ms, tempo decorrido = 1 ms. Tabela '## t1'. Contagem de varredura 0, leituras lógicas 10016, leituras físicas 0, leituras de read-ahead 0, leituras lógicas de lob 0, leituras físicas de lob 0, leituras físicas de lob 0, leituras de read-ahead de lob 0. Tabela 's1'. Contagem de varredura 1, leituras lógicas 19, leituras físicas 0, leituras antecipadas 0, leituras lógicas lob 0, leituras lógicas lob 0, leituras físicas lob 0, leituras antecipadas lob. Tempos de execução do SQL Server: Tempo de CPU = 47 ms, tempo decorrido = 45 ms. (10000 linhas afetadas)
Por que existem tantas leituras na tabela ## temp quando estou inserindo apenas nela?
fonte