Три SELECT
утверждения в этом коде
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;
создать этот план:
Почему final SELECT
, который выбирает постоянное значение, генерирует оператор Compute Scalar ?
sql-server
sql-server-2008
execution-plan
Ник Чаммас
источник
источник
[tempdb].[dbo].[persist_test].id
и он вычисляет значение, несмотря на то, что он сохранен.Ответы:
Просто для подведения итогов экспериментальных результатов в комментариях, это, кажется, крайний случай, который возникает, когда у вас есть два вычисляемых столбца в одной таблице, один
persisted
и один не сохраняются, и оба имеют одно и то же определение.В плане запроса
При сканировании таблицы
persist_test
генерируется толькоid
столбец. Следующий вычисляющий скаляр умножает это на 5 и выдает столбец, вызываемыйid5
несмотря на то, что на этот столбец даже нет ссылки в запросе. Финальный скаляр вычислений принимает значениеid5
и выводит его как вызванный столбецid5p
.Использование флагов трассировки, описанных в Query Optimizer Deep Dive - часть 2 (отказ от ответственности: эти флаги трассировки не документированы / не поддерживаются) и анализ запроса
Дает вывод
Дерево перед нормализацией проекта
Дерево после нормализации проекта
Таким образом, получается, что все определения вычисляемых столбцов расширяются, а затем на этапе нормализации проекта все идентичные выражения сопоставляются с вычисляемыми столбцами, и
id5
в этом случае это просто совпадает . то есть это не дает никакого предпочтенияpersisted
колонке.Если таблица воссоздается со следующим определением
Затем запрос либо
id5
илиid5p
будет удовлетворен, читая сохраненную версию данных , а не делать расчет во время выполнения , поэтому согласование , как представляется , произойдет (по крайней мере , в данном случае), чтобы колонки.источник