s planos de execução do Oracle ao usar o operador LIKE com uma função DETERMINISTIC
gora, tenho uma coisa realmente complicada com os planos de execução do Oracle que estão causando estragos quando uso umDETERMINISTIC
no lado direito doLIKE
operador. Esta é a minha situação:
Eu pensei que seria sensato executar uma consulta como esta (simplificada):
SELECT [...]
FROM customers cust
JOIN addresses addr ON addr.cust_id = cust.id
WHERE special_char_filter(cust.surname) like special_char_filter(?)
E eu ligaria?
para algo como'Eder%'
. Agoracustomers
eaddresses
são mesas muito grandes. É por isso que é importante usar índices. Obviamente, existe um índice regular emaddresses.cust_id
. Mas também criei um índice baseado em função emspecial_char_filter(customers.surname)
, que funciona muito bem.
O problema é que a consulta acima envolve umlike
cláusula @ cria planos de execução com FULL TABLE SCANS emaddresses
. Parece que algo nesta consulta impede o Oracle de usar índices emaddresses.cust_id
.
Descobri que a solução para o meu problema é esta:
SELECT [...]
FROM customers cust
JOIN addresses addr ON addr.cust_id = cust.id
WHERE special_char_filter(cust.surname) like ?
Removi o DETERMINISTIC
!) do lado direito do operador like e pré-calculou a variável bind em Java. Agora, essa consulta é hiper-rápida, sem varreduras de tabela completa. Isso também é muito rápido (embora não equivalente):
SELECT [...]
FROM customers cust
JOIN addresses addr ON addr.cust_id = cust.id
WHERE special_char_filter(cust.surname) = special_char_filter(?)
A confusã Eu não entendo isso. O que há de errado em ter funções determinísticas no lado direito dolike
operador? Eu observei isso no Oracle 11.2.0.1.0