Yorumlardaki deneysel bulguları özetlemek gerekirse, bu, aynı tabloda bir persisted
ve biri kalıcı olmayan ve ikisi de aynı tanıma sahip iki hesaplanmış sütun olduğunda ortaya çıkan bir uç durum gibi görünüyor .
Sorgu planında
SELECT id5p
FROM dbo.persist_test;
Tablo taraması persist_test
yalnızca id
sütunu yayar . Bir sonraki hesaplama skaleri, 5 ile çarpar ve id5
bu sütunun sorguda bile referans edilmemesine rağmen çağrılan bir sütunu çıkarır. Son hesaplama skalar boyunca değeri alınır id5
ve bir sütun olarak adlandırır id5p
.
Sorgu Optimize Edici Derin Dalış - Bölüm 2'de açıklanan izleme işaretlerini kullanma (sorumluluk reddi: bu izleme bayrakları belgesiz / desteklenmez) ve sorguyu inceler
SELECT id5,
id5p,
( id * 5 )
FROM dbo.persist_test
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8606);
Çıktı verir
Proje Normalleştirmeden Önce Ağaç
LogOp_Project
LogOp_Get TBL: dbo.persist_test dbo.persist_test TableID=1717581157 TableReferenceID=0 IsRow: COL: IsBaseRow1002
AncOp_PrjList
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5
ScaOp_Arithmetic x_aopMult
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id
ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5p
ScaOp_Arithmetic x_aopMult
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id
ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)
AncOp_PrjEl COL: Expr1004
ScaOp_Arithmetic x_aopMult
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id
ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)
Proje Normalizasyonundan Sonra Ağaç
LogOp_Project
LogOp_Get TBL: dbo.persist_test dbo.persist_test TableID=1717581157 TableReferenceID=0 IsRow: COL: IsBaseRow1002
AncOp_PrjList
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5p
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5
AncOp_PrjEl COL: Expr1004
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5
Dolayısıyla, hesaplanan tüm sütun tanımları genişletilir ve ardından Proje Normalleştirme aşamasında tüm özdeş ifadeler hesaplanan sütunlarla eşleştirilir id5
ve bu durumda eşleşir . yani persisted
sütuna herhangi bir tercih vermez .
Tablo aşağıdaki tanımla yeniden oluşturulmuşsa
CREATE TABLE dbo.persist_test (
id INT NOT NULL
, id5p AS (5 * id) PERSISTED
, id5 AS (5 * id)
);
Ardından , çalışma zamanında hesaplama yapmak yerine verilerin kalıcı sürümünü okumaktan ya id5
da id5p
bu istek yerine getirilmesinden dolayı, eşleştirme sütun sırasına göre (en azından bu durumda) gerçekleşir.
[tempdb].[dbo].[persist_test].id
ve kalıcı olmasına rağmen değeri hesaplar.