Trzy SELECT
instrukcje w tym kodzie
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;
wygeneruj ten plan:
Dlaczego finał SELECT
, który wybiera utrwaloną wartość, generuje operator obliczania skalarnego ?
sql-server
sql-server-2008
execution-plan
Nick Chammas
źródło
źródło
[tempdb].[dbo].[persist_test].id
i oblicza wartość pomimo utrwalenia.Odpowiedzi:
Podsumowując ustalenia eksperymentalne w komentarzach, wydaje się, że jest to przypadek skrajny, który występuje, gdy masz dwie kolumny obliczeniowe w tej samej tabeli, jedna
persisted
i jedna nie przetrwały i oba mają tę samą definicję.W planie zapytania
Skanowanie tabeli na
persist_test
emituje tylkoid
kolumnę. Następny obliczyć skalar wzdłuż mnoży to przez 5 i zwraca kolumnę wywoływaną,id5
mimo że kolumna nie jest nawet przywoływana w zapytaniu. Końcowy skalar obliczeniowy wraz przyjmuje wartośćid5
i dane wyjściowe, które są nazywane kolumnąid5p
.Korzystanie z flag śledzenia wyjaśnionych w Query Optimizer Deep Dive - Część 2 (zrzeczenie się: te flagi śledzenia są nieudokumentowane / nieobsługiwane) i przeglądanie zapytania
Daje wynik
Drzewo przed normalizacją projektu
Drzewo po normalizacji projektu
Wygląda więc na to, że wszystkie obliczone definicje kolumn są rozszerzane, a następnie na etapie normalizacji projektu wszystkie identyczne wyrażenia są ponownie dopasowywane do kolumn obliczeniowych i
id5
w tym przypadku akurat się dopasowuje . tzn. nie daje pierwszeństwapersisted
kolumnie.Jeśli tabela zostanie ponownie utworzona z następującą definicją
Następnie żądanie odczytu
id5
lub wykonaniaid5p
będzie spełnione po odczytaniu utrwalonej wersji danych zamiast przeprowadzaniu obliczeń w środowisku wykonawczym, więc dopasowanie wydaje się mieć miejsce (przynajmniej w tym przypadku) w kolejności kolumn.źródło