sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server - indexera på en beräknad kolumn?

Förutsatt att du har dina fält i detta format:

00Data0007
000000Data0011
0000Data0015

kan du göra följande:

  • Skapa en beräknad kolumn:ndata AS RIGHT(REVERSE(data), LEN(data) - 4)

    Detta kommer att omvandla dina kolumner till följande:

    ataD00
    ataD000000
    ataD0000
    
  • Skapa ett index för den kolumnen

  • Skicka den här frågan för att söka efter strängen Data :

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

    Det första villkoret kommer att använda ett index för grovfiltrering.

    Den andra kommer att se till att alla inledande tecken (som blev de efterföljande tecknen i den beräknade kolumnen) bara är nollor.

Se det här inlägget i min blogg för detaljer om prestanda:

Uppdatera

Om du bara vill ha ett index på SUBSTRING utan att ändra ditt schema är att skapa en vy ett alternativ.

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. Hur hittar man luckor i sekventiell numrering i mysql?

  2. Korsdatabasfrågor, förenar fördelar och nackdelar

  3. MYSQL Infoga id från en annan tabell

  4. Installera MySQL på Ubuntu utan en lösenordsuppmaning