Se la tua stringa è più lunga di 900 byte, non può essere una chiave di indice, indipendentemente dal fatto che sia di lunghezza variabile o fissa.
Un'idea sarebbe almeno rendere le ricerche più selettive aggiungendo una colonna calcolata. es.
CREATE TABLE dbo.Strings
(
-- other columns,
WholeString VARCHAR(4000),
Substring AS (CONVERT(VARCHAR(10), WholeString) PERSISTED
);
CREATE INDEX ss ON dbo.Strings(Substring);
Ora, quando cerchi una riga da aggiornare, puoi dire:
WHERE s.Substring = LEFT(@string, 10)
AND s.WholeString = @string;
Ciò aiuterà almeno l'ottimizzatore a restringere la ricerca alle pagine dell'indice in cui è più probabile che vi sia la corrispondenza esatta. Potresti voler sperimentare quella lunghezza poiché dipende da quante stringhe simili hai e da cosa aiuterà meglio l'ottimizzatore a eliminare una singola pagina. Potresti anche provare a includere alcune o tutte le altre colonne nel ss
index, con o senza l'utilizzo di INCLUDE
clausola (se questo è utile varierà notevolmente in base a vari fattori come cos'altro fa la query di aggiornamento, rapporto di lettura/scrittura, ecc.).