Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server - Index für eine berechnete Spalte?

Angenommen, Sie haben Ihre Felder in diesem Format:

00Data0007
000000Data0011
0000Data0015

, können Sie Folgendes tun:

  • Erstellen Sie eine berechnete Spalte:ndata AS RIGHT(REVERSE(data), LEN(data) - 4)

    Dadurch werden Ihre Spalten wie folgt umgewandelt:

    ataD00
    ataD000000
    ataD0000
    
  • Erstellen Sie einen Index für diese Spalte

  • Setzen Sie diese Abfrage ab, um nach der Zeichenfolge Data zu suchen :

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

    Die erste Bedingung verwendet einen Index zur groben Filterung.

    Die zweite stellt sicher, dass alle führenden Zeichen (die in der berechneten Spalte zu den nachgestellten Zeichen wurden) nichts als Nullen sind.

Siehe diesen Eintrag in meinem Blog für Leistungsdetails:

Aktualisieren

Wenn Sie nur einen Index für SUBSTRING wollen ohne Ihr Schema zu ändern, ist das Erstellen einer Ansicht eine Option.

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'