Les trois SELECT
déclarations de ce 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;
générer ce plan:
Pourquoi la finale SELECT
, qui sélectionne une valeur persistante, génère-t-elle un opérateur de calcul scalaire ?
sql-server
sql-server-2008
execution-plan
Nick Chammas
la source
la source
[tempdb].[dbo].[persist_test].id
et elle calcule la valeur malgré sa persistance.Réponses:
Juste pour résumer les résultats expérimentaux dans les commentaires, cela semble être un cas extrême qui se produit lorsque vous avez deux colonnes calculées dans la même table, une
persisted
et une non persistante et qu'elles ont toutes les deux la même définition.Dans le plan de la requête
L'analyse de la table sur
persist_test
n'émet que laid
colonne. Le prochain calcul scalaire multiplie cela par 5 et génère une colonne appeléeid5
malgré le fait que cette colonne n'est même pas référencée dans la requête. Le scalaire de calcul final prend la valeur deid5
et affiche cette valeur sous la forme d'une colonne appeléeid5p
.Utilisation des indicateurs de trace expliqués dans Query Optimizer Deep Dive - Partie 2 (avertissement: ces indicateurs de trace sont non documentés / non pris en charge) et en regardant la requête
Donne la sortie
Arborescence avant la normalisation du projet
Arborescence après la normalisation du projet
Il apparaît donc que toutes les définitions de colonnes calculées sont développées, puis pendant la phase de normalisation du projet, toutes les expressions identiques sont mises en correspondance avec les colonnes calculées et il se trouve que cela correspond
id5
dans ce cas. c'est-à-dire qu'il ne donne aucune préférence à lapersisted
colonne.Si la table est recréée avec la définition suivante
Ensuite, une demande pour
id5
ouid5p
sera satisfaite en lisant la version persistante des données plutôt qu'en effectuant le calcul au moment de l'exécution, de sorte que la correspondance semble se produire (au moins dans ce cas) dans l'ordre des colonnes.la source