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 unDETERMINISTIC
unción @ en el lado derecho de laLIKE
operador. Esta es mi situación:
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.
l problema es que la consulta anterior involucra unalike
a 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
.
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