As três SELECT
instruções neste código
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;
gere este plano:
Por que o final SELECT
, que está selecionando um valor persistente, gera um operador Escalar de computação ?
sql-server
sql-server-2008
execution-plan
Nick Chammas
fonte
fonte
[tempdb].[dbo].[persist_test].id
e calcula o valor apesar de persistir.Respostas:
Apenas para resumir as descobertas experimentais nos comentários, este parece ser um caso extremo que ocorre quando você tem duas colunas computadas na mesma tabela, uma
persisted
e uma não persistiram e ambas têm a mesma definição.No plano para a consulta
A varredura da tabela
persist_test
emite apenas aid
coluna. O próximo escalar de computação multiplica isso por 5 e gera uma coluna chamada,id5
apesar do fato de essa coluna nem sequer ser referenciada na consulta. O escalar final de computação leva o valor deid5
e gera como uma coluna chamadaid5p
.Usando os sinalizadores de rastreamento explicados no Query Optimizer Deep Dive - Parte 2 (isenção de responsabilidade: esses sinalizadores de rastreamento não são documentados / não são suportados) e examinando a consulta
Dá a saída
Árvore antes da normalização do projeto
Árvore após a normalização do projeto
Portanto, parece que todas as definições de coluna computadas são expandidas e, durante o estágio de Normalização do Projeto, todas as expressões idênticas são correspondidas novamente às colunas computadas e, por acaso, coincide
id5
nesse caso. isto é, não dá nenhuma preferência àpersisted
coluna.Se a tabela for recriada com a seguinte definição
Em seguida, uma solicitação para
id5
ouid5p
será satisfeita pela leitura da versão persistente dos dados, em vez de fazer o cálculo no tempo de execução, para que a correspondência pareça ocorrer (pelo menos nesse caso) na ordem das colunas.fonte