sql >> Base de Datos >  >> RDS >> Oracle

Consulta de Oracle usando 'me gusta' en la columna de números indexados, rendimiento deficiente

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:

  1. La conversión se ejecuta para cada fila, lo cual es lento;
  2. 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:

  1. Crear un índice basado en funciones en A1.ID columna:

    CREATE INDEX people_idx5 ON people (TO_CHAR(id));

  2. 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.

  3. Crear un separado columna ID_CHAR de tipo VARCHAR2 y rellénelo con TO_CHAR(id) . Indexarlo y usarlo en lugar de ID en tu WHERE 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.