Невъзможно е да добавите индекс към изчислена колона, освен ако не е детерминистична.
"Детерминистичните функции винаги връщат един и същ резултат при всяко извикване с конкретен набор от входни стойности и при едно и също състояние на базата данни. Недетерминистичните функции могат да връщат различни резултати всеки път, когато се извикват с конкретен набор от входни стойности дори ако състоянието на базата данни, до което имат достъп, остава същото."
- Създаване на индекси на изчислени колони
- Указания за проектиране на дефинирани от потребителя функции
Пример:
CREATE FUNCTION dbo.FuncA()
RETURNS [float]
WITH SCHEMABINDING -- required option
BEGIN
RETURN 1.0 -- DB engine parses body, and marks this func. as 'deterministic'
END
GO
CREATE TABLE TableA (
K int primary key clustered,
A AS dbo.FuncA() PERSISTED -- must be persisted
)
GO
CREATE VIEW ViewA
WITH SCHEMABINDING -- required option
AS
SELECT K, A FROM dbo.TableA
GO
CREATE UNIQUE CLUSTERED INDEX IDX1 ON dbo.ViewA (K, A)
GO
Трябва да посочите PERSISTED
за неточни типове данни като [real]
и [float]
, в друг случай можете свободно да създадете индекс на изглед с изчислена колона ([decimal] ще бъде ОК).