Sql-Server

在非持久計算列 SQL Server 上創建非聚集索引

  • February 7, 2017

我正在努力尋找有關 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 對此很有幫助)。

引用自:https://dba.stackexchange.com/questions/163528