Considérez le MCVE simple suivant:
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
Lorsque j'exécute les insertions suivantes, l'insertion dans #t1
ne montre aucune entrée / sortie de statistiques pour la table temporaire. Cependant, l' insertion dans le ##t1
fait Voir les statistiques d' E / S pour la table temporaire.
SET STATISTICS IO, TIME ON;
GO
INSERT INTO #t1 (r)
SELECT r
FROM dbo.s1;
La sortie des statistiques:
Temps d'analyse et de compilation de SQL Server: Temps CPU = 0 ms, temps écoulé = 1 ms. Tableau 's1'. Nombre de balayages 1, lectures logiques 19, lectures physiques 0, lectures anticipées 0, lectures logiques 0, lob lectures physiques 0, lob lectures anticipées 0. Temps d'exécution de SQL Server: Temps CPU = 16 ms, temps écoulé = 9 ms. (10000 lignes affectées)
INSERT INTO ##t1 (r)
SELECT r
FROM dbo.s1;
Temps d'analyse et de compilation de SQL Server: Temps CPU = 0 ms, temps écoulé = 1 ms. Tableau '## t1'. Nombre de balayages 0, lectures logiques 10016, lectures physiques 0, lectures anticipées 0, lectures logiques 0, lob lectures physiques 0, lob lectures anticipées 0. Tableau 's1'. Nombre de balayages 1, lectures logiques 19, lectures physiques 0, lectures anticipées 0, lectures logiques 0, lob lectures physiques 0, lob lectures anticipées 0. Temps d'exécution de SQL Server: Temps CPU = 47 ms, temps écoulé = 45 ms. (10000 lignes affectées)
Pourquoi y a-t-il autant de lectures sur la table ## temp alors que je ne fais que l'insérer?