Il est impossible d'ajouter un index sur une colonne calculée, sauf si c'est déterministe.
"Les fonctions déterministes renvoient toujours le même résultat chaque fois qu'elles sont appelées avec un ensemble spécifique de valeurs d'entrée et étant donné le même état de la base de données. Les fonctions non déterministes peuvent renvoyer des résultats différents chaque fois qu'elles sont appelées avec un ensemble spécifique de valeurs d'entrée même si l'état de la base de données auquel ils accèdent reste le même."
- Création d'index sur des colonnes calculées
- Instructions de conception de fonctions définies par l'utilisateur
Exemple :
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
Vous devez spécifier PERSISTED
pour les types de données imprécis comme [real]
et [float]
, dans d'autres cas, vous pouvez créer librement un index sur une vue avec une colonne calculée ([décimal] sera OK).