Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come creare un indice per una colonna di stringhe in sql?

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.).