Die drei SELECT
Anweisungen in diesem Code
USE [tempdb];
GO
SET NOCOUNT ON;
CREATE TABLE dbo.persist_test (
id INT NOT NULL
, id5 AS (id * 5)
, id5p AS (id * 5) PERSISTED
);
INSERT INTO dbo.persist_test (id)
VALUES (1), (2), (3);
SELECT id
FROM dbo.persist_test;
SELECT id5
FROM dbo.persist_test;
SELECT id5p
FROM dbo.persist_test;
DROP TABLE dbo.persist_test;
Generieren Sie diesen Plan:
Warum SELECT
generiert das Finale , das einen dauerhaften Wert auswählt, einen Compute Scalar- Operator?
sql-server
sql-server-2008
execution-plan
Nick Chammas
quelle
quelle
[tempdb].[dbo].[persist_test].id
und der Wert berechnet, obwohl er beibehalten wird.Antworten:
Nur um die experimentellen Ergebnisse in den Kommentaren zusammenzufassen, scheint dies ein Randfall zu sein, der auftritt, wenn Sie zwei berechnete Spalten in derselben Tabelle haben, eine
persisted
und eine nicht beibehalten und beide dieselbe Definition haben.Im Plan für die Abfrage
Der Table Scan on
persist_test
gibt nur dieid
Spalte aus. Der nächste Berechnungsskalar multipliziert dies mit 5 und gibt eine aufgerufene Spalte aus,id5
obwohl in der Abfrage nicht einmal auf diese Spalte verwiesen wird. Der endgültige Berechnungsskalar nimmt den Wert vonid5
und gibt diesen als aufgerufene Spalte ausid5p
.Verwenden der in Query Optimizer Deep Dive - Teil 2 erläuterten Ablaufverfolgungsflags (Haftungsausschluss: Diese Ablaufverfolgungsflags werden nicht dokumentiert / nicht unterstützt) und Betrachten der Abfrage
Gibt die Ausgabe aus
Baum vor Projektnormalisierung
Baum nach Projektnormalisierung
Es sieht also so aus, als würden alle berechneten Spaltendefinitionen während der Phase der Projektnormalisierung erweitert und alle identischen Ausdrücke wieder mit berechneten Spalten abgeglichen, was
id5
in diesem Fall einfach zutrifft . dh diepersisted
Spalte wird nicht bevorzugt .Wenn die Tabelle mit der folgenden Definition neu erstellt wird
Dann wird eine Anfrage für entweder
id5
oderid5p
wird beim Lesen der persistente Version der Daten erfüllt werden , anstatt die Berechnung zur Laufzeit zu tun , um die passenden (zumindest in diesem Fall) zu passieren scheint in Spaltenreihenfolge.quelle