2017-02-08 5 views
0

Ist es möglich, einen Index für Spalte mit Änderungen dieser Spalte zu erstellen. Zum Beispiel - Ich habe eine Spalte A (nvarchar), Aber in der Abfrage sollte ich Werte aus dieser Spalte ersetzen, um mit Werten in der Liste zu vergleichen. Klassische Index wird nur funktionieren, wenn ich ursprünglichen Werte aus Spalte A verwendenSQL-Index für geänderte Spalte

Die Abfrage sieht aus wie nächste

SELECT 
    * 
FROM 
    MyTable 
WHERE 
    REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe') 
+0

Funktion Verwendung in der Where-Klausel 'Index' Verwendung vermeiden. Aktualisieren Sie Ihre 'A'-Spalte mit' replace'-Funktion, dann ersetzen Sie die Funktion in 'where'-Klausel. –

+0

@Prdp Ja, ich kenne diesen Weg, aber ich muss die ursprünglichen Werte speichern. In diesem Moment sehe ich nur den Weg - neue Spalte B mit ersetzten Daten zu erstellen und einen Index für diese Spalte zu erstellen. Aber es wird viele doppelte Daten geben. – AndrewVA

+0

Mögliches Duplikat von [SQL Server - Index für eine berechnete Spalte?] (Http://stackoverflow.com/questions/1323214/sql-server-index-on-a-computed-column) – Serg

Antwort

0

Sie können eine berechnete Spalte erstellen und dann einen Index für sie erstellen.

Hinweis: SQL Server-Indexschlüsselspalten haben eine 900 byte size limit. Da Ihre Spalte NVARCHAR ist, verbraucht sie 2 Bytes für jedes Zeichen. Also können wir den Index auf 400 Zeichen (800 Bytes) beschränken.

Um Platz zu sparen, können wir diese Spalte weiter einschränken, damit sie nur dann einen Wert enthält, wenn sie Ihren Anforderungen entspricht.

ALTER TABLE MyTable 
ADD A_NoSpace AS (CASE WHEN REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe') THEN LEFT(REPLACE(A, ' ', ''), 400) END) PERSISTED 

CREATE NONCLUSTERED INDEX IX_A_NoSpace ON MyTable (A_NoSpace) 

Als PERSISTED Spalte Berechnung stattfinden wird nur während INSERT oder UPDATE Operationen.

Sie können nun diese Spalte in Ihrer Abfrage verwenden:

SELECT * 
FROM 
MyTable 
-- Don't need to check if value is in the list, 
-- because we're already doing this in the computed column definition 
WHERE A_NoSpace IS NOT NULL 
Verwandte Themen