Oracle ejecuta planes cuando usa el operador LIKE con una función DETERMINISTIC

Ahora tengo algo realmente complicado con los planes de ejecución de Oracle que causan estragos, cuando uso unDETERMINISTICunción @ en el lado derecho de laLIKE operador. Esta es mi situación:

La situació

Pensé que sería prudente ejecutar una 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(?)

Y me uniría? a algo como'Eder%'. Ahoracustomers yaddresses son mesas muy grandes. Por eso es importante usar índices. Por supuesto, hay un índice regular enaddresses.cust_id. Pero también he creado un índice basado en funciones enspecial_char_filter(customers.surname), que funciona bastante bien.

El problem

l problema es que la consulta anterior involucra unalikea cláusula @ crea planes de ejecución con ESCANEOS DE TABLA COMPLETA enaddresses. Parece que algo en esta consulta evita que Oracle use índices enaddresses.cust_id.

La solución alternativa

Descubrí que la solución a mi problema es esta:

SELECT [...]
FROM customers cust
JOIN addresses addr ON addr.cust_id = cust.id
WHERE special_char_filter(cust.surname) like ?

Eliminé el DETERMINISTIC!) funcionan desde el lado derecho del operador similar y calculan previamente la variable de enlace en Java. Ahora esta consulta es hiperrápida, sin ESCANEOS DE TABLA COMPLETA. Esto también es muy rápido (aunque no equivalente):

SELECT [...]
FROM customers cust
JOIN addresses addr ON addr.cust_id = cust.id
WHERE special_char_filter(cust.surname) = special_char_filter(?)
La confusió

No entiendo esto. ¿Qué tiene de malo tener funciones deterministas en el lado derecho de lalike operador? He observado esto en Oracle 11.2.0.1.0

Respuestas a la pregunta(3)

Su respuesta a la pregunta