Oracle
 sql >> Datenbank >  >> RDS >> Oracle

PL/SQL-Leistungsoptimierung für LIKE '%...%' Wildcard-Abfragen

Wie bereits erwähnt, können Sie den Namensspalten einen ctx-Kontextindex hinzufügen.

Unter der Annahme, dass eine kleine Anzahl von Datensätzen aktualisiert wird, besteht eine Möglichkeit darin, Ihren Index täglich zu aktualisieren. (und aufzeichnen, wann es passiert ist)

fügen Sie dann eine letzte Aktualisierungsdatumsspalte und einen Index zu Ihrer zu durchsuchenden Tabelle hinzu.

Es sollte möglich sein, Ihren ctx-Index nach den meisten alten, unveränderten Daten zu durchsuchen und aus dem kleinen Prozentsatz aktualisierter Daten auszuwählen, indem Sie das traditionelle LIKE verwenden, z. B.:

WHERE (lastupdated<lastrefresh AND contains(name,'%ABC%')) 
   OR (lastupdated>lastrefresh AND name like '%ABC%')

HINWEIS:Möglicherweise stellen Sie fest, dass Ihr Abfrageplan ein wenig verrückt wird (viele Bitmap-Konvertierungen in Zeilen-IDs). Teilen Sie in diesem Fall die beiden Teile des OR in eine UNION ALL-Abfrage auf, z. B.

SELECT id FROM mytable   
    WHERE 
    (lastupdate>lastrefresh and name LIKE '%ABC%')
    UNION ALL
    SELECT id FROM mytable   
    WHERE lastupdate<lastrefresh and CONTAINS(name, '%ABC%', 1) > 0