Partager via


Des index sur les colonnes calculées

Vous pouvez définir des index sur des colonnes calculées tant que les exigences suivantes sont remplies :

  • Exigences en matière de propriété

  • Exigences de déterminisme

  • Exigences de précision

  • Exigences en matière de type de données

  • Configuration requise pour les options SET

Exigences en matière de propriété

Toutes les références de fonction dans la colonne calculée doivent avoir le même propriétaire que la table.

Exigences de déterminisme

Important

Les expressions sont déterministes si elles retournent toujours le même résultat pour un ensemble d’entrées spécifié. La propriété IsDeterministic de la fonction COLUMNPROPERTY indique si un computed_column_expression est déterministe.

La computed_column_expression doit être déterministe. Un computed_column_expression est déterministe lorsqu’un ou plusieurs des éléments suivants sont vrais :

  • Toutes les fonctions référencées par l’expression sont déterministes et précises. Ces fonctions incluent les fonctions définies par l’utilisateur et intégrées. Pour plus d’informations, consultez Fonctions déterministes et non déterministes. Les fonctions peuvent être imprécises si la colonne calculée est persistante. Pour plus d’informations, consultez Création d’index sur des colonnes calculées persistantes plus loin dans cette rubrique.

  • Toutes les colonnes référencées dans l’expression proviennent de la table qui contient la colonne calculée.

  • Aucune référence de colonne n’extrait les données de plusieurs lignes. Par exemple, les fonctions d’agrégation telles que SUM ou AVG dépendent des données de plusieurs lignes et rendent un computed_column_expression non déterministe.

  • Le computed_column_expression n’a pas d’accès aux données système ou d’accès aux données utilisateur.

Toute colonne calculée qui contient une expression CLR (Common Language Runtime) doit être déterministe et marquée PERSISTED avant que la colonne puisse être indexée. Les expressions de type clR définies par l’utilisateur sont autorisées dans les définitions de colonnes calculées. Les colonnes calculées dont le type est un type défini par l’utilisateur CLR peuvent être indexées tant que le type est comparable. Pour plus d’informations, consultez Types CLR définis par l’utilisateur.

Remarque

Lorsque vous faites référence à des littéraux de chaîne du type de données date dans les colonnes calculées indexées dans SQL Server, nous vous recommandons de convertir explicitement le littéral en type de date souhaité à l’aide d’un style de format de date déterministe. Pour obtenir la liste des styles de format de date déterministes, consultez CAST et CONVERT. Les expressions qui impliquent une conversion implicite de chaînes de caractères en types de données date sont considérées comme non déterministes, sauf si le niveau de compatibilité de la base de données est défini sur 80 ou version antérieure. Cela est dû au fait que les résultats dépendent des paramètres LANGUAGE et DATEFORMAT de la session serveur. Par exemple, les résultats de l’expression CONVERT (datetime, '30 listopad 1996', 113) dépendent du paramètre LANGUAGE, car la chaîne '30 listopad 1996' signifie des mois différents dans différentes langues. De même, dans l’expression DATEADD(mm,3,'2000-12-01'), le moteur de base de données interprète la chaîne '2000-12-01' en fonction du paramètre DATEFORMAT.

La conversion implicite de données de caractères non Unicode entre les classements est également considérée comme non déterministe, sauf si le niveau de compatibilité est défini sur 80 ou version antérieure.

Lorsque le paramètre de niveau de compatibilité de la base de données est 90, vous ne pouvez pas créer d’index sur des colonnes calculées qui contiennent ces expressions. Toutefois, les colonnes calculées existantes qui contiennent ces expressions à partir d’une base de données mise à niveau peuvent être gérées. Si vous utilisez des colonnes calculées indexées qui contiennent des conversions de chaîne implicites à des dates, pour éviter toute altération possible de l’index, assurez-vous que les paramètres LANGUAGE et DATEFORMAT sont cohérents dans vos bases de données et applications.

Exigences de précision

Le computed_column_expression doit être précis. Une computed_column_expression est précise lorsqu’une ou plusieurs des conditions suivantes sont remplies :

  • Il ne s’agit pas d’une expression des types de données float ou real.

  • Il n’utilise ni float ni real comme type de données dans sa définition. Par exemple, dans l’instruction suivante, la colonne y est int et déterministe, mais pas précise.

    CREATE TABLE t2 (a int, b int, c int, x float,   
       y AS CASE x   
             WHEN 0 THEN a   
             WHEN 1 THEN b   
             ELSE c   
          END);  
    

Remarque

Toute expression float ou real est considérée comme imprécise et ne peut pas être une clé d’un index ; une expression float ou real peut être utilisée dans une vue indexée, mais pas comme clé. Cela est vrai également pour les colonnes calculées. Toute fonction, expression ou fonction définie par l’utilisateur est considérée comme imprécise si elle contient une float ou real plusieurs expressions. Cela inclut des éléments logiques (comparaisons).

La propriété IsPrecise de la fonction COLUMNPROPERTY indique si un computed_column_expression est précis.

Exigences relatives au type de données

  • La computed_column_expression définie pour la colonne calculée ne peut pas être évaluée aux types de données text, ntext, ou image.

  • Les colonnes calculées dérivées de image, ntext, text, varchar(max), nvarchar(max), varbinary(max), et xml peuvent être indexées tant que le type de données de colonne calculée est autorisé en tant que colonne clé d'index.

  • Les colonnes calculées dérivées des colonnes calculées , ntextet text les types de imagedonnées peuvent être des colonnes non clés (incluses) dans un index non cluster tant que le type de données de colonne calculée est autorisé en tant que colonne d’index non clé.

Configuration requise pour l’option SET

  • L’option de niveau connexion ANSI_NULLS doit être définie sur ON lorsque l’instruction CREATE TABLE ou ALTER TABLE qui définit la colonne calculée est exécutée. La fonction OBJECTPROPERTY indique si l’option est activée via la propriété IsAnsiNullsOn .

  • La connexion sur laquelle l’index est créé et toutes les connexions qui essaient d’exécuter des instructions INSERT, UPDATE ou DELETE qui modifient les valeurs dans l’index doivent avoir six options SET définies sur ON et une option définie sur OFF. L’optimiseur ignore un index sur une colonne calculée pour toute instruction SELECT exécutée par une connexion qui n’a pas ces mêmes paramètres d’option.

    • L’option NUMERIC_ROUNDABORT doit être définie sur OFF, et les options suivantes doivent être définies sur ON :

    • ANSI_NULLS

    • ANSI_PADDING

    • ANSI_WARNINGS (Paramètre des avertissements ANSI)

    • ARITHABORT

    • CONCAT_NULL_YIELDS_NULL

    • IDENTIFIANT_CITÉ

    L'affectation de la valeur ON à ANSI_WARNINGS affecte de manière implicite la valeur ON à ARITHABORT, lorsque le niveau de compatibilité de la base de données est d'au moins 90.

Création d’index sur des colonnes calculées persistantes

Vous pouvez créer un index sur une colonne calculée définie avec une expression déterministe, mais imprécise si la colonne est marquée PERSISTED dans l’instruction CREATE TABLE ou ALTER TABLE. Cela signifie que le moteur de base de données utilise ces valeurs persistantes lorsqu’il crée un index sur la colonne et lorsque l’index est référencé dans une requête. Cette option vous permet de créer un index sur une colonne calculée lorsque .NET Framework est à la fois déterministe et précis.

COLUMNPROPERTY (Transact-SQL)