Rozważ następujące proste 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
Kiedy uruchamiam następujące wstawki, wstawianie do #t1
nie pokazuje żadnych statystyk we / wy dla tabeli temp. Jednak wstawienie do ##t1
robi Pokaż statystyki I / O dla tabeli temp.
SET STATISTICS IO, TIME ON;
GO
INSERT INTO #t1 (r)
SELECT r
FROM dbo.s1;
Dane wyjściowe statystyk:
Czas analizy i kompilacji programu SQL Server: Czas procesora = 0 ms, czas, który upłynął = 1 ms. Tabela „s1”. Liczba skanów 1, logiczne odczyty 19, fizyczne odczyty 0, odczyt z wyprzedzeniem 0, lob logiczne odczyty 0, lob fizyczne odczyty 0, lob odczyty z wyprzedzeniem 0. Czasy wykonania programu SQL Server: Czas procesora = 16 ms, czas, który upłynął = 9 ms. (Dotyczy 10000 wierszy)
INSERT INTO ##t1 (r)
SELECT r
FROM dbo.s1;
Czas analizy i kompilacji programu SQL Server: Czas procesora = 0 ms, czas, który upłynął = 1 ms. Tabela „## t1”. Liczba skanów 0, logiczne odczyty 10016, fizyczne odczyty 0, odczyt z wyprzedzeniem 0, lob logiczne odczyty 0, lob fizyczne odczyty 0, lob odczyty z wyprzedzeniem 0. Tabela „s1”. Liczba skanów 1, logiczne odczyty 19, fizyczne odczyty 0, odczyt z wyprzedzeniem 0, lob logiczne odczyty 0, lob fizyczne odczyty 0, lob odczyty z wyprzedzeniem 0. Czasy wykonania programu SQL Server: Czas procesora = 47 ms, czas, który upłynął = 45 ms. (Dotyczy 10000 wierszy)
Dlaczego w tabeli temp ## jest tak wiele odczytów, gdy tylko się do niej wstawiam?
źródło