sql >> Database >  >> RDS >> Sqlserver

Hoe maak je een index voor een stringkolom in sql?

Als uw string langer is dan 900 bytes, kan het geen indexsleutel zijn, ongeacht of deze een variabele of een vaste lengte heeft.

Een idee zou zijn om zoekacties in ieder geval selectiever te maken door een berekende kolom toe te voegen. bijv.

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

Als je nu zoekt naar een rij om bij te werken, kun je zeggen:

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

Dit zal de optimaliseerder in ieder geval helpen zijn zoekopdracht te verfijnen tot de indexpagina's waar de exacte overeenkomst het meest waarschijnlijk voorkomt. Misschien wil je met die lengte experimenteren, omdat het afhangt van hoeveel vergelijkbare strings je hebt en wat de optimizer het beste helpt om een ​​enkele pagina te verwijderen. U kunt ook experimenteren met het opnemen van enkele of alle andere kolommen in de ss index, met of zonder gebruik van de INCLUDE clausule (of dit nuttig is, hangt sterk af van verschillende factoren, zoals wat uw update-query nog meer doet, lees-/schrijfverhouding, enz.).



  1. Een CSV-bestand importeren in een externe Oracle-tabel

  2. Onjuiste tekenreeksfout bij het toevoegen van emoji aan een database via een formulier

  3. Hoe kan ik het mysql-wachtwoord instellen in het mysqld_safe draait-scenario?

  4. Gemakkelijke manier om een ​​SQL-tabel te exporteren zonder toegang tot de server of phpMyADMIN