sql >> Databasteknik >  >> RDS >> Sqlserver

Hur skapar man ett index för en strängkolumn i sql?

Om din sträng är längre än 900 byte kan den inte vara en indexnyckel, oavsett om den är variabel eller fast längd.

En idé skulle vara att åtminstone göra sökningar mer selektiva genom att lägga till en beräknad kolumn. t.ex.

CREATE TABLE dbo.Strings
(
  -- other columns,
  WholeString VARCHAR(4000),
  Substring AS (CONVERT(VARCHAR(10), WholeString) PERSISTED
);
CREATE INDEX ss ON dbo.Strings(Substring);

När du nu söker efter en rad att uppdatera kan du säga:

WHERE s.Substring = LEFT(@string, 10)
AND s.WholeString = @string;

Detta kommer åtminstone att hjälpa optimeraren att begränsa sin sökning till de indexsidor där den exakta matchningen är mest sannolikt att leva. Du kanske vill experimentera med den längden eftersom det beror på hur många liknande strängar du har och vad som bäst hjälper optimeraren att rensa bort en enda sida. Du kanske också vill experimentera med att inkludera några eller alla andra kolumner i ss index, med eller utan att använda INCLUDE klausul (om detta är användbart kommer att variera mycket beroende på olika faktorer som vad mer din uppdateringsfråga gör, läs/skrivförhållande, etc).



  1. FÅ DIAGNOSTIK med COPY-sats i Pl/pgsql-funktionen

  2. DISTINCT ON i django

  3. psycopg2:infoga flera rader med en fråga

  4. Hur genererar man sekventiellt radnummer i tsql?