Saya berjuang untuk menemukan dokumentasi tentang bagaimana SQL Server benar-benar menyimpan kolom yang dikomputasi non-persisten.
Ambil contoh berikut:
--SCHEMA
CREATE TABLE dbo.Invoice
(
InvoiceID INT IDENTITY(1, 1) PRIMARY KEY,
CustomerID INT FOREIGN KEY REFERENCES dbo.Customer(CustomerID),
InvoiceStatus NVARCHAR(50) NOT NULL,
InvoiceStatusID AS CASE InvoiceStatus
WHEN 'Sent' THEN 1
WHEN 'Complete' THEN 2
WHEN 'Received' THEN 3
END
)
GO
--INDEX
CREATE NONCLUSTERED INDEX IX_Invoice ON Invoice
(
CustomerID ASC
)
INCLUDE
(
InvoiceStatusID
)
GO
Saya mendapatkan bahwa itu disimpan pada tingkat daun, tetapi jika nilainya tidak bertahan bagaimana bisa disimpan? Bagaimana indeks membantu SQL Server menemukan baris ini dalam situasi ini?
Setiap bantuan sangat dihargai,
Terimakasih banyak,
EDIT:
Terima kasih kepada Brent & Aaron untuk menjawab ini, inilah PasteThePlan dengan jelas menunjukkan apa yang mereka jelaskan.
sql-server
sql-server-2012
index
computed-column
Uberzen1
sumber
sumber
Jawaban:
Ketika SQL Server membuat indeks pada bidang yang dihitung, bidang yang dihitung ditulis ke disk pada saat itu - tetapi hanya pada 8K halaman indeks itu. SQL Server dapat menghitung InvoiceStatusID saat membaca melalui indeks berkerumun - tidak perlu menulis data itu ke indeks berkerumun.
Saat Anda menghapus / memperbarui / menyisipkan baris dalam dbo.Invoice, data dalam indeks tetap diperbarui. (Ketika InvoiceStatus berubah, SQL Server juga tahu untuk memperbarui IX_Invoice.)
Cara terbaik untuk melihat ini sendiri adalah dengan benar-benar melakukannya: buat objek ini, dan jalankan pembaruan yang menyentuh bidang InvoiceStatusID. Posting rencana eksekusi (PasteThePlan.com sangat membantu untuk ini) jika Anda ingin bantuan melihat di mana pembaruan indeks terjadi.
sumber
Nilai untuk kolom indeks yang diindeks dan tidak bertahan tidak bertahan di halaman data tabel , tetapi tetap di halaman indeks . Itu tetap non-persisten dalam tabel, terlepas dari apakah itu tetap di 0, 1, atau beberapa indeks.
Hanya untuk mengilustrasikan deskripsi Brent, dengan mengambil contoh yang Anda berikan, mari kita masukkan baris:
Sekarang, mari kita lihat halaman indeks:
(Jelas berubah
dbname
, dan ID indeks mungkin tidak 2 dalam kasus Anda.)Output (milik Anda pasti akan berbeda):
Dan akhirnya, mari kita periksa halaman untuk
PageType
2:(Anda mungkin perlu mengubah 7 untuk mencocokkan id basis data Anda, dan jika Anda memiliki banyak file data, Anda mungkin perlu mengubah argumen kedua untuk mencocokkan
PageFID
dari hasil pertama.)Keluaran:
Itu ada di halaman indeks.
sumber
Atribut
PERSISTED
untuk kolom yang dihitung berkaitan dengan apakah nilai-nilai tersebut bertahan dalam tabel (indeks berkerumun atau tumpukan) dan bukan apakah nilai-nilai tersebut bertahan dalam indeks.The
CREATE INDEX
memiliki persyaratan untuk keterbatasan mengenai kolom dihitung dan indeks:Tidak ada batasan apakah kolom yang dihitung tetap ada atau tidak.
dan selanjutnya (bukan tentang yang disertakan tetapi tentang kolom yang dihitung di bagian utama indeks):
sumber