Hanya untuk meringkas temuan eksperimental dalam komentar ini tampaknya menjadi kasus tepi yang terjadi ketika Anda memiliki dua kolom yang dihitung dalam tabel yang sama, satu persisted
dan satu tidak bertahan dan keduanya memiliki definisi yang sama.
Dalam rencana kueri
SELECT id5p
FROM dbo.persist_test;
Tabel memindai pada persist_test
hanya memancarkan id
kolom. Komputasi skalar berikutnya bersama mengalikan bahwa dengan 5 dan menghasilkan kolom yang disebut id5
meskipun fakta bahwa kolom ini bahkan tidak direferensikan dalam kueri. Skalar komputasi akhir sepanjang mengambil nilai id5
dan output yang disebut kolom id5p
.
Menggunakan tanda jejak yang dijelaskan dalam Penyelidikan Dalam Query Optimizer - Bagian 2 (penafian: tanda ini tidak berdokumen / tidak didukung) dan melihat kueri
SELECT id5,
id5p,
( id * 5 )
FROM dbo.persist_test
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8606);
Memberikan hasilnya
Pohon Sebelum Normalisasi Proyek
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)
Pohon Setelah Normalisasi Proyek
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
Jadi tampak bahwa semua definisi kolom yang dihitung diperluas kemudian selama tahap Normalisasi Proyek semua ekspresi yang identik dicocokkan kembali ke kolom yang dihitung dan kebetulan cocok dengan id5
dalam kasus ini. yaitu tidak memberikan preferensi ke persisted
kolom.
Jika tabel dibuat kembali dengan definisi berikut
CREATE TABLE dbo.persist_test (
id INT NOT NULL
, id5p AS (5 * id) PERSISTED
, id5 AS (5 * id)
);
Kemudian permintaan untuk salah satu id5
atau id5p
akan puas dari membaca versi data yang bertahan daripada melakukan perhitungan saat runtime sehingga pencocokan tampaknya terjadi (setidaknya dalam kasus ini) dalam urutan kolom.
[tempdb].[dbo].[persist_test].id
dan menghitung nilai meskipun tetap ada.