Wenn Ihr String länger als 900 Bytes ist, kann es sich nicht um einen Indexschlüssel handeln, unabhängig davon, ob er eine variable oder eine feste Länge hat.
Eine Idee wäre, Suchvorgänge zumindest selektiver zu machen, indem eine berechnete Spalte hinzugefügt wird. z. B.
CREATE TABLE dbo.Strings
(
-- other columns,
WholeString VARCHAR(4000),
Substring AS (CONVERT(VARCHAR(10), WholeString) PERSISTED
);
CREATE INDEX ss ON dbo.Strings(Substring);
Wenn Sie jetzt nach einer zu aktualisierenden Zeile suchen, können Sie Folgendes sagen:
WHERE s.Substring = LEFT(@string, 10)
AND s.WholeString = @string;
Dies hilft dem Optimierer zumindest dabei, seine Suche auf die Indexseiten einzugrenzen, auf denen die genaue Übereinstimmung am wahrscheinlichsten zu finden ist. Sie können mit dieser Länge experimentieren, da sie davon abhängt, wie viele ähnliche Zeichenfolgen Sie haben und was dem Optimierer am besten hilft, eine einzelne Seite auszusortieren. Sie können auch damit experimentieren, einige oder alle anderen Spalten in ss
aufzunehmen Index, mit oder ohne Verwendung des INCLUDE
-Klausel (ob dies nützlich ist, hängt stark von verschiedenen Faktoren ab, z. B. was Ihre Aktualisierungsabfrage sonst noch tut, Lese-/Schreibverhältnis usw.).