LIKE condición de coincidencia de patrones espera ver los tipos de caracteres como operandos del lado izquierdo y del lado derecho. Cuando encuentra un NÚMERO, implícitamente lo convierte en char. Su Consulta 1 básicamente se reescribe silenciosamente a esto:
SELECT a1.*
FROM people a1
WHERE TO_CHAR(a1.id) LIKE '119%'
AND ROWNUM < 5
Eso pasa en tu caso, y eso es malo por 2 razones:
- La conversión se ejecuta para cada fila, lo cual es lento;
- Debido a una función (aunque implícita) en un predicado WHERE, Oracle no puede usar el índice en
A1.ID
columna.
Para solucionarlo, debe realizar una de las siguientes acciones:
-
Crear un índice basado en funciones en
A1.ID
columna:CREATE INDEX people_idx5 ON people (TO_CHAR(id));
-
Si necesita hacer coincidir registros en los primeros 3 caracteres de la columna ID, cree otra columna de tipo NÚMERO que contenga solo estos 3 caracteres y use un = simple operador en él.
-
Crear un separado columna
ID_CHAR
de tipoVARCHAR2
y rellénelo conTO_CHAR(id)
. Indexarlo y usarlo en lugar deID
en tuWHERE
condición.Por supuesto, si elige crear una columna adicional basada en la columna de ID existente, debe mantener esos 2 sincronizados. Puede hacerlo en lote como una sola ACTUALIZACIÓN, o en un disparador ON-UPDATE, o agregar esa columna a la apropiada INSERTAR y ACTUALIZAR declaraciones en su código.