Si su cadena tiene más de 900 bytes, entonces no puede ser una clave de índice, independientemente de si es de longitud variable o fija.
Una idea sería al menos hacer que las búsquedas sean más selectivas agregando una columna calculada. por ejemplo
CREATE TABLE dbo.Strings
(
-- other columns,
WholeString VARCHAR(4000),
Substring AS (CONVERT(VARCHAR(10), WholeString) PERSISTED
);
CREATE INDEX ss ON dbo.Strings(Substring);
Ahora, cuando busque una fila para actualizar, puede decir:
WHERE s.Substring = LEFT(@string, 10)
AND s.WholeString = @string;
Esto al menos ayudará al optimizador a limitar su búsqueda a las páginas de índice donde es más probable que viva la coincidencia exacta. Es posible que desee experimentar con esa longitud, ya que depende de cuántas cadenas similares tenga y qué ayudará mejor al optimizador a eliminar una sola página. También puede experimentar incluyendo algunas o todas las otras columnas en el ss
índice, con o sin usar INCLUDE
cláusula (si esto es útil variará mucho según varios factores, como qué más hace su consulta de actualización, relación de lectura/escritura, etc.).