sql >> Base de Datos >  >> RDS >> Database

Ejemplo de mejora del rendimiento de consultas con índices

En este artículo, veremos cómo un índice puede mejorar el rendimiento de las consultas.

Introducción

Los índices en Oracle y otras bases de datos son objetos que almacenan referencias a datos en otras tablas. Se utilizan para mejorar el rendimiento de las consultas, con mayor frecuencia la instrucción SELECT.

No son una "bala de plata":no siempre resuelven los problemas de rendimiento con las declaraciones SELECT. Sin embargo, ciertamente pueden ayudar.

Consideremos esto en un ejemplo particular.

Ejemplo

Para este ejemplo, vamos a usar una sola tabla llamada Cliente que contiene columnas como ID, Nombre, Apellido, valor de crédito máximo, valor de fecha de creación y otras columnas que no usaremos.

SELECT customer_id,first_name,last_name, max_credit, created_date
FROM customer;

Aquí hay una muestra de la tabla.

[identificación de la tabla=38 /]

Ahora, vamos a encontrar lo siguiente:

  • ¿Quiénes de los clientes se agregaron a la mesa en la misma fecha con los primeros clientes?
  • Clientes filtrados por apellido en orden ascendente
  • Mostrar la identificación del cliente, nombre, apellido, crédito máximo y fecha de creación

Para hacer esto, cree la siguiente consulta:

SELECT customer_id,
first_name,
last_name,
max_credit,
created_date
FROM customer
WHERE created_date = (
     SELECT MIN(created_date)
     FROM customer
)
ORDER BY last_name;

La salida se ve así:

[identificación de la tabla=39 /]

Muestra los datos que queremos.

Rendimiento antes de aplicar el índice

Ahora, veamos el plan de explicación para esta consulta. Lo obtuve ejecutando EXPLAIN PLAN FOR para la instrucción SELECT y el siguiente comando:

SELECT * FROM TABLE(dbms_xplan.display);

También puede obtener un resultado de salida similar utilizando la función Explicar plan dentro de su IDE.

Podemos ver que realiza un Table Access Full en dos puntos, a saber, en la subconsulta y en la consulta externa. Esto se debe a que no hay índices en la tabla para usar.

Tiene un costo de 2934. Cuando lo ejecuté, la consulta obtuvo 785 filas en 1,9 segundos. Puede parecer rápido, pero este es solo un ejemplo en el que podemos mejorar. Las consultas en sistemas reales pueden tardar mucho más.

Una forma de mejorar el rendimiento de esta consulta es agregar un índice a la columna created_date. Esta columna se usa tanto en la cláusula WHERE de la consulta externa como en la función MIN de la consulta interna.

Añadir índice

Podemos agregar un índice a esta tabla para mejorar el rendimiento de la consulta. Este índice se almacenará en la columna created_date para que el código se vea así:

CREATE INDEX idx_cust_cdate
ON customer (created_date);

Ahora, el índice se crea solo en esta columna. Debería darnos una mejora en el rendimiento de nuestra consulta, pero tendremos que verificarlo primero.

Hemos creado un índice de árbol b, que probablemente sea todo lo que necesitamos en esta columna. Lo confirmaremos en el plan de explicación en breve. He escrito una guía sobre los índices de Oracle que incluye cómo saber qué tipo de índice se debe usar, así como mucha otra información valiosa.

Rendimiento después del índice Agregado

Volvamos a ejecutar el plan de explicación en esta consulta.

Podemos ver que se ha utilizado un índice en el último paso. Muestra que se ha ejecutado un Full Scan con el índice idx_cust_cdate, que es el que acabamos de crear.

También muestra un costo total de 1472 y obtiene los 785 registros en 0,9 segundos.

El tiempo de ejecución solo ha mejorado ligeramente (de 1,9 a 0,9 segundos), pero eso representa una mejora de alrededor del 50 % simplemente agregando el índice a este pequeño conjunto de datos.

Como se mencionó anteriormente, las consultas reales serán más complicadas que esta y llevará más tiempo ejecutarlas. Pero este es un ejemplo de cómo un índice puede mejorar el plan de consulta y el tiempo de ejecución de la consulta.