Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server:indice su una colonna calcolata?

Supponendo che tu abbia i tuoi campi in questo formato:

00Data0007
000000Data0011
0000Data0015

, puoi fare quanto segue:

  • Crea una colonna calcolata:ndata AS RIGHT(REVERSE(data), LEN(data) - 4)

    Questo trasformerà le tue colonne nelle seguenti:

    ataD00
    ataD000000
    ataD0000
    
  • Crea un indice su quella colonna

  • Invia questa query per cercare la stringa 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 prima condizione utilizzerà un indice per il filtraggio grossolano.

    Il secondo assicurerà che tutti i caratteri iniziali (che sono diventati i caratteri finali nella colonna calcolata) non siano altro che zeri.

Vedi questa voce nel mio blog per i dettagli sulle prestazioni:

Aggiorna

Se vuoi solo un indice su SUBSTRING senza modificare lo schema, la creazione di una vista è un'opzione.

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'