Sql-Server
在非持久計算列 SQL Server 上創建非聚集索引
我正在努力尋找有關 SQL Server 如何實際儲存非持久計算列的任何文件。
舉個例子:
--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
我知道它儲存在葉級別,但是如果該值沒有被持久化,那麼任何東西是如何儲存的呢?在這種情況下,索引如何幫助 SQL Server 找到這些行?
非常感謝任何幫助,
非常感謝,
編輯:
感謝 Brent 和 Aaron 回答這個問題,這是 PasteThePlan清楚地顯示了他們解釋的內容。
當 SQL Server 在計算域上創建索引時,計算域在那個時候被寫入磁碟 - 但僅在該索引的 8K 頁上。SQL Server 可以在讀取聚集索引時計算 InvoiceStatusID - 無需將該數據寫入聚集索引。
當您在 dbo.Invoice 中刪除/更新/插入行時,索引中的數據會保持最新。(當 InvoiceStatus 發生變化時,SQL Server 知道也要更新 IX_Invoice。)
親眼看到這一點的最佳方式是實際操作:創建這些對象,並執行觸及 InvoiceStatusID 欄位的更新。如果您需要幫助查看索引更新發生的位置,請發布執行計劃(PasteThePlan.com 對此很有幫助)。