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'