Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server - index sur une colonne calculée ?

En supposant que vous ayez vos champs dans ce format :

00Data0007
000000Data0011
0000Data0015

, vous pouvez effectuer les opérations suivantes :

  • Créez une colonne calculée :ndata AS RIGHT(REVERSE(data), LEN(data) - 4)

    Cela transformera vos colonnes en ce qui suit :

    ataD00
    ataD000000
    ataD0000
    
  • Créer un index sur cette colonne

  • Émettez cette requête pour rechercher la chaîne Data :

    SELECT  *
    FROM    mytable
    WHERE   ndata LIKE N'ataD%'
            AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
    

    La première condition utilisera un index pour le filtrage grossier.

    La seconde s'assurera que tous les caractères de début (qui sont devenus les caractères de fin dans la colonne calculée) ne sont rien d'autre que des zéros.

Voir cette entrée dans mon blog pour plus de détails sur les performances :

Mettre à jour

Si vous voulez juste un index sur SUBSTRING sans changer votre schéma, la création d'une vue est une option.

CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT  s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM    mytable

CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)

SELECT  id, data
FROM    v_substring75
WHERE   substring75 = '12345'