Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server - índice em uma coluna computada?


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 string Data :
    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'