sql >> Databasteknik >  >> RDS >> Oracle

Oracle-fråga med "gilla" på kolumnen för indexerad nummer, dålig prestanda

SOM mönstermatchande skick förväntar sig att se teckentyper som operander på både vänster och höger sida. När den stöter på ett NUMMER konverterar den implicit det till char. Din fråga 1 är i princip tyst omskriven till detta:

SELECT a1.*
  FROM people a1
 WHERE TO_CHAR(a1.id) LIKE '119%'
   AND ROWNUM < 5

Det händer i ditt fall, och det är dåligt av två anledningar:

  1. Konverteringen utförs för varje rad, vilket är långsamt;
  2. På grund av en funktion (men implicit) i ett WHERE-predikat kan Oracle inte använda indexet på A1.ID kolumn.

För att komma runt det måste du göra något av följande:

  1. Skapa ett funktionsbaserat indexA1.ID kolumn:

    CREATE INDEX people_idx5 ON people (TO_CHAR(id));

  2. Om du behöver matcha poster på de första tre tecknen i ID-kolumnen, skapa en annan kolumn av typen NUMBER som bara innehåller dessa tre tecken och använd en vanlig = operatör på den.

  3. Skapa en separat kolumn ID_CHAR av typen VARCHAR2 och fyll den med TO_CHAR(id) . Indexera det och använd istället för ID i din WHERE skick.

    Om du väljer att skapa ytterligare en kolumn baserad på befintlig ID-kolumn måste du naturligtvis hålla dessa 2 synkroniserade. Du kan göra det i batch som en enda UPPDATERING, eller i en ON-UPDATE-utlösare, eller lägga till den kolumnen i lämplig INSERT och UPDATE-satser i din kod.



  1. Snabbaste sättet att uppdatera 120 miljoner rekord

  2. ACOS() Exempel i SQL Server

  3. Mysql BESTÄLL GENOM att använda datumdataraden

  4. Praktisk gräns för SQL-frågans längd (särskilt MySQL)