Considere el siguiente MCVE simple:
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
Cuando ejecuto las siguientes inserciones, la inserción en #t1
no muestra estadísticas de E / S para la tabla temporal. Sin embargo, la inserción en ##t1
sí muestra estadísticas de E / S para la tabla temporal.
SET STATISTICS IO, TIME ON;
GO
INSERT INTO #t1 (r)
SELECT r
FROM dbo.s1;
La salida de estadísticas:
Tiempo de análisis y compilación de SQL Server: Tiempo de CPU = 0 ms, tiempo transcurrido = 1 ms. Tabla 's1'. Cuenta de escaneo 1, lecturas lógicas 19, lecturas físicas 0, lecturas de lectura anticipada 0, lecturas lógicas lob 0, lecturas físicas lob 0, lecturas lob de lectura anticipada 0. Tiempos de ejecución de SQL Server: Tiempo de CPU = 16 ms, tiempo transcurrido = 9 ms. (10000 filas afectadas)
INSERT INTO ##t1 (r)
SELECT r
FROM dbo.s1;
Tiempo de análisis y compilación de SQL Server: Tiempo de CPU = 0 ms, tiempo transcurrido = 1 ms. Tabla '## t1'. Cuenta de escaneo 0, lecturas lógicas 10016, lecturas físicas 0, lecturas de lectura anticipada 0, lecturas lógicas lob 0, lecturas físicas lob 0, lecturas de lectura lob 0. Tabla 's1'. Cuenta de escaneo 1, lecturas lógicas 19, lecturas físicas 0, lecturas de lectura anticipada 0, lecturas lógicas lob 0, lecturas físicas lob 0, lecturas lob de lectura anticipada 0. Tiempos de ejecución de SQL Server: Tiempo de CPU = 47 ms, tiempo transcurrido = 45 ms. (10000 filas afectadas)
¿Por qué hay tantas lecturas en la tabla temporal ## cuando solo la estoy insertando?