Suponiendo que tiene sus campos en este formato:
00Data0007
000000Data0011
0000Data0015
, puede hacer lo siguiente:
-
Cree una columna calculada:
ndata AS RIGHT(REVERSE(data), LEN(data) - 4)
Esto transformará sus columnas en lo siguiente:
ataD00 ataD000000 ataD0000
-
Crea un índice en esa columna
-
Emita esta consulta para buscar la cadena
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 primera condición usará un índice para el filtrado grueso.
El segundo se asegurará de que todos los caracteres iniciales (que se convirtieron en los caracteres finales en la columna calculada) no sean más que ceros.
Consulte esta entrada en mi blog para obtener detalles sobre el rendimiento:
Actualizar
Si solo desea un índice en SUBSTRING
sin cambiar su esquema, crear una vista es una opción.
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'