sql >> Base de Datos >  >> RDS >> Oracle

Ajuste de rendimiento de PL/SQL para consultas comodín LIKE '%...%'

Como ya se mencionó, podría agregar un índice de contexto ctx a las columnas de nombre.

suponiendo que se actualice una pequeña cantidad de registros, una opción es actualizar su índice diariamente. (y registre cuándo sucedió)

luego agregue una columna de fecha de última actualización y un índice a la tabla que se está buscando.

Debería ser posible escanear su índice ctx para la mayoría de los datos antiguos sin cambios y seleccionar del pequeño porcentaje de datos actualizados usando el LIKE tradicional, por ejemplo:

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

NOTA:es posible que su plan de consulta se vuelva un poco loco (muchas conversiones de mapas de bits a ID de fila) en ese caso, divida las 2 partes de OR en una consulta UNION ALL.p. ej.

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