Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Ajuste de desempenho de PL/SQL para consultas curinga LIKE '%...%'


Como já mencionado, você pode adicionar um índice de contexto ctx às colunas de nome.

supondo que um pequeno número de registros seja atualizado, uma opção é atualizar seu índice diariamente. (e registre quando aconteceu)

em seguida, adicione uma coluna e índice de data da última atualização à sua tabela que está sendo pesquisada.

Deve ser possível escanear seu índice ctx para a maioria dos dados inalterados antigos e selecionar a partir da pequena porcentagem de dados atualizados usando o LIKEe.g tradicional:
WHERE (lastupdated<lastrefresh AND contains(name,'%ABC%')) 
   OR (lastupdated>lastrefresh AND name like '%ABC%')

NOTA:você pode achar que seu plano de consulta fica um pouco mental (muitas conversões de bitmap para ids de linha) nesse caso, divida as 2 partes do OR em uma consulta UNION ALL.
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