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:

A situaçã

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 problem

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.

A solução alternativa

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

questionAnswers(3)

yourAnswerToTheQuestion