Jeśli twój łańcuch jest dłuższy niż 900 bajtów, to nie może być kluczem indeksu, niezależnie od tego, czy ma zmienną czy stałą długość.
Jednym z pomysłów byłoby przynajmniej uczynienie poszukiwań bardziej selektywnymi przez dodanie kolumny obliczeniowej. np.
CREATE TABLE dbo.Strings
(
-- other columns,
WholeString VARCHAR(4000),
Substring AS (CONVERT(VARCHAR(10), WholeString) PERSISTED
);
CREATE INDEX ss ON dbo.Strings(Substring);
Teraz, szukając wiersza do aktualizacji, możesz powiedzieć:
WHERE s.Substring = LEFT(@string, 10)
AND s.WholeString = @string;
Pomoże to przynajmniej optymalizatorowi zawęzić wyszukiwanie do stron indeksu, na których istnieje największe prawdopodobieństwo wystąpienia dokładnego dopasowania. Możesz poeksperymentować z tą długością, ponieważ zależy ona od tego, ile masz podobnych ciągów i co najlepiej pomoże optymalizatorowi wyeliminować pojedynczą stronę. Możesz także poeksperymentować z włączeniem niektórych lub wszystkich innych kolumn do ss
indeks, z lub bez użycia INCLUDE
klauzula (czy to jest przydatne, będzie się znacznie różnić w zależności od różnych czynników, takich jak co jeszcze robi zapytanie aktualizacyjne, współczynnik odczytu/zapisu itp.).