Я изо всех сил пытаюсь найти любую документацию о том, как 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 создает индекс для вычисляемого поля, вычисляемое поле записывается на диск в это время - но только на 8К-страницах этого индекса. SQL Server может вычислить InvoiceStatusID, когда он читает кластерный индекс - нет необходимости записывать эти данные в кластерный индекс.
При удалении / обновлении / вставке строк в dbo.Invoice данные в индексах обновляются. (При изменении InvoiceStatus SQL Server также знает, как обновить IX_Invoice.)
Лучший способ убедиться в этом самому - это сделать это: создать эти объекты и выполнить обновления, которые касаются поля InvoiceStatusID. Опубликуйте план выполнения (для этого полезно PasteThePlan.com), если вам нужна помощь, чтобы увидеть, где происходят обновления индекса.
источник
Значение для индексированного непостоянного вычисляемого столбца не сохраняется на страницах данных таблицы , но сохраняется на страницах индекса . Он не сохраняется в таблице независимо от того, сохраняется ли он в 0, 1 или нескольких индексах.
Просто чтобы проиллюстрировать описание Брента на примере, который вы привели, давайте вставим строку:
Теперь давайте посмотрим на страницы индекса:
(Очевидно, изменится
dbname
, и идентификатор индекса не может быть 2 в вашем случае.)Вывод (ваш обязательно будет отличаться):
И, наконец, давайте проверим страницу на
PageType
2:(Вам, вероятно, потребуется изменить 7, чтобы соответствовать идентификатору базы данных, и если у вас есть несколько файлов данных, вам может потребоваться изменить второй аргумент, чтобы он совпадал
PageFID
с первым результатом.)Вывод:
Это на странице индекса.
источник
Атрибут
PERSISTED
для вычисляемого столбца относится к тому, сохраняются ли значения в таблице (кластеризованный индекс или куча), а не к тому, сохраняются ли значения в индексе.CREATE INDEX
Имеет требование к ограничениям в отношении вычисляемых столбцов и индексов:Нет ограничений относительно того, сохраняется ли вычисляемый столбец или нет.
и далее (не о включенных, а о вычисляемых столбцах в основной части индекса):
источник