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

SQL Server - indeks på en beregnet kolonne?

Forudsat at du har dine felter i dette format:

00Data0007
000000Data0011
0000Data0015

, kan du gøre følgende:

  • Opret en beregnet kolonne:ndata AS RIGHT(REVERSE(data), LEN(data) - 4)

    Dette vil forvandle dine kolonner til følgende:

    ataD00
    ataD000000
    ataD0000
    
  • Opret et indeks på den kolonne

  • Udsted denne forespørgsel for at søge efter strengen Data :

    SELECT  *
    FROM    mytable
    WHERE   ndata LIKE N'ataD%'
            AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
    

    Den første betingelse vil bruge et indeks til grovfiltrering.

    Den anden vil sikre, at alle indledende tegn (der blev de efterfølgende tegn i den beregnede kolonne) ikke er andet end nuller.

Se dette indlæg i min blog for detaljer om ydeevne:

Opdater

Hvis du bare vil have et indeks på SUBSTRING uden at ændre dit skema, er det en mulighed at oprette en visning.

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'


  1. grundlæggende datosammenligning for udløbskontrol

  2. Postgres:INDSÆT hvis den ikke allerede eksisterer

  3. PHP SQL få SELECT COUNT(bruger) til variabel

  4. Bedste måde at gemme enorme logdata