Supondo que você tenha seus campos neste formato:
00Data0007
000000Data0011
0000Data0015
, você pode fazer o seguinte:
-
Crie uma coluna computada:ndata AS RIGHT(REVERSE(data), LEN(data) - 4)
Isso transformará suas colunas no seguinte:
ataD00 ataD000000 ataD0000
-
Crie um índice nessa coluna
-
Emita esta consulta para pesquisar a stringData
:
SELECT * FROM mytable WHERE ndata LIKE N'ataD%' AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
A primeira condição usará um índice para filtragem grosseira.
O segundo garantirá que todos os caracteres iniciais (que se tornaram os caracteres finais na coluna computada) não sejam nada além de zeros.
Veja esta entrada no meu blog para detalhes de desempenho:
Atualizar
Se você quer apenas um índice em
SUBSTRING
sem alterar seu esquema, criar uma visualização é uma opção. 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'