Articulo de referencia

Escaneo completo de la tabla

Un escaneo completo de tabla (también conocido como escaneo secuencial ) es un escaneo realizado en una base de datos donde cada fila de la tabla se lee en orden secuencial (en ...

Un escaneo completo de tabla (también conocido como escaneo secuencial ) es un escaneo realizado en una base de datos donde cada fila de la tabla se lee en orden secuencial (en serie) y las columnas encontradas se verifican para comprobar la validez de una condición. [ 1 ] Los escaneos completos de tabla [ 2 ] suelen ser el método más lento para escanear una tabla debido a la gran cantidad de lecturas de E/S requeridas del disco, que consisten en múltiples búsquedas, así como costosas transferencias de disco a memoria.

Descripción general

En una base de datos, una consulta no indexada da como resultado un escaneo completo de la tabla, donde la base de datos procesa cada registro para encontrar todos los que cumplen con los requisitos especificados. Incluso si la consulta selecciona solo unas pocas filas, se examinarán todas las filas de la tabla. Esto suele resultar en un rendimiento subóptimo, pero puede ser aceptable con tablas muy pequeñas o cuando el costo de mantener los índices actualizados es elevado.

Cuando el optimizador considera un escaneo completo de la tabla

El factor más importante a la hora de elegir depende de la velocidad. Esto significa que se debe utilizar un escaneo completo de la tabla cuando sea el más rápido y no se pueda utilizar una ruta de acceso diferente. A continuación se muestran varios ejemplos de escaneo completo de la tabla. [ 3 ]

  • Sin índice El optimizador debe usar un escaneo completo de la tabla ya que no existe ningún índice.
  • Número reducido de filas. El coste de un escaneo completo de la tabla es menor que el de un escaneo de rango de índice debido al tamaño reducido de la tabla.
  • Cuando se procesó la consulta SELECT COUNT(*), existían valores nulos en la columna. La consulta está contando el número de columnas nulas en un índice típico. Sin embargo, SELECT COUNT(*) no puede contar el número de columnas nulas.
  • La consulta no es selectiva. El número de filas devueltas es demasiado grande y ocupa casi el 100% de toda la tabla. Estas filas no son selectivas.
  • Las estadísticas de la tabla no se actualizan. El número de filas en la tabla es mayor que antes, pero las estadísticas de la tabla aún no se han actualizado. El optimizador no puede estimar correctamente que usar el índice es más rápido.
  • La tabla tiene un alto grado de paralelismo. El alto grado de paralelismo de la tabla distorsiona al optimizador de una manera real, porque el optimizador usaría un escaneo completo de la tabla.
  • Sugerencia de escaneo completo de la tabla. Esta sugerencia permite al optimizador usar un escaneo completo de la tabla.

Ejemplos

El primer ejemplo muestra una sentencia SQL que devuelve el nombre de cada fruta en la tabla fruits cuyo color es rojo. Si la tabla fruits no tiene un índice para la columna color, entonces el motor de la base de datos debe cargar y examinar cada fila dentro de fruits para comparar el color de cada fila con 'rojo':

SELECCIONAR nombre DE frutas DONDE color = 'rojo' ;

El segundo ejemplo muestra una instrucción SQL que devuelve el nombre de todas las frutas en la tabla fruits. Dado que esta instrucción no tiene ninguna condición (ninguna cláusula WHERE), el motor de la base de datos utilizará un escaneo de tabla para cargar y devolver los datos de esta consulta, incluso si la tabla fruits tiene un índice en la columna name, porque acceder (es decir, escanear) la tabla directamente es más rápido que acceder a ella a través de la capa de abstracción adicional de un índice.

SELECCIONAR nombre DE frutas

El tercer ejemplo es un contraejemplo que casi con toda seguridad provocará que el motor SQL utilice un índice en lugar de un escaneo de tabla. Este ejemplo utiliza prácticamente la misma consulta que la anterior, pero añade una cláusula ORDER BY para que los nombres devueltos aparezcan en orden alfabético. Suponiendo que la tabla de frutas tenga un índice en la columna de nombre, el motor de base de datos utilizará ahora ese índice para devolver los nombres en orden, ya que acceder a la tabla a través de la capa de abstracción adicional del índice proporciona la ventaja de devolver las filas en el orden solicitado. Si el motor hubiera cargado las filas mediante un escaneo de tabla, tendría que realizar el trabajo adicional de ordenar las filas devueltas. En algunos casos extremos, por ejemplo, si las estadísticas del motor de base de datos indican que la tabla contiene un número muy pequeño de filas, el optimizador aún podría decidir utilizar un escaneo de tabla para este tipo de consulta.

SELECCIONAR nombre DE frutas ORDENAR POR nombre

Ventajas y desventajas

Ventajas:

  • El coste es predecible, ya que el sistema de base de datos necesita escanear la tabla completa fila por fila cada vez.
  • Cuando la tabla ocupa menos del 2 por ciento del búfer de bloques de la base de datos, el escaneo completo de la tabla es más rápido.

Desventajas:

  • El escaneo completo de una tabla se produce cuando no hay índice o SQL no utiliza ningún índice . El resultado de un escaneo completo suele ser más lento que el de un escaneo de tabla indexada. Esto se debe a que, cuanto mayor sea la tabla, más lento será el retorno de datos.
  • El escaneo completo e innecesario de la tabla generará una enorme cantidad de operaciones de entrada/salida innecesarias , lo que supondrá una carga para todo el proceso de la base de datos.

Véase también

Referencias

  1. "Cómo evitar escaneos de tablas" . Oracle. 2011.
  2. "¿Qué es más rápido: el acceso por índice o el escaneo de tabla?" . Microsoft TechNet. 2002.
  3. "Rutas de acceso del optimizador" . Oracle. 2013.
  • Consejos para el escaneo completo de tablas en Oracle