Oracle
 sql >> Database >  >> RDS >> Oracle

Ottimizzazione delle prestazioni PL/SQL per query con caratteri jolly LIKE '%...%'

Come già accennato potresti aggiungere un indice di contesto ctx alle colonne dei nomi.

supponendo che un piccolo numero di record venga aggiornato, 1 opzione è aggiornare l'indice ogni giorno. (e registra quando è successo)

quindi aggiungi una colonna e un indice della data dell'ultimo aggiornamento alla tabella che stai cercando.

Dovrebbe essere possibile scansionare il tuo indice ctx per la maggior parte dei vecchi dati invariati e selezionare dalla piccola percentuale di dati aggiornati usando il tradizionale LIKE es:

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

NOTA:potresti scoprire che il tuo piano di query diventa un po' mentale (molte conversioni bitmap in ID di riga), in tal caso dividi le 2 parti dell'OR in una query UNION ALL.es

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