Oracle
 sql >> Base de données >  >> RDS >> Oracle

Réglage des performances PL/SQL pour les requêtes génériques LIKE '%...%'

Comme déjà mentionné, vous pouvez ajouter un index de contexte ctx aux colonnes de nom.

en supposant qu'un petit nombre d'enregistrements soient mis à jour, une option consiste à actualiser votre index quotidiennement. (et notez quand c'est arrivé)

puis ajoutez une colonne et un index de date de dernière mise à jour à votre table recherchée.

Il devrait être possible d'analyser votre index ctx pour la majorité des anciennes données inchangées et de sélectionner parmi le petit pourcentage de données mises à jour en utilisant le traditionnel LIKEe.g :

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

REMARQUE :vous constaterez peut-être que votre plan de requête devient un peu mental (beaucoup de conversions de bitmap en identifiants de ligne), dans ce cas, divisez les 2 parties de l'OU en une requête UNION ALL, par exemple

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