Un escaneo completo de la 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 un orden secuencial (en serie) y las columnas encontradas se verifican para verificar la validez de una condición. [1] Los escaneos de tablas completas [2] suelen ser el método más lento de escanear una tabla debido a la gran cantidad de lecturas de E / S requeridas desde el disco que consta de múltiples búsquedas así como costosas transferencias de disco a memoria.
Descripción general
En una base de datos, una consulta que no está indexada da como resultado un escaneo completo de la tabla, donde la base de datos procesa cada registro de la tabla para encontrar todos los registros que cumplen con los requisitos dados. Incluso si la consulta selecciona solo unas pocas filas de la tabla, se examinarán todas las filas de la tabla completa. Esto generalmente da como resultado un rendimiento subóptimo, pero puede ser aceptable con tablas muy pequeñas o cuando la sobrecarga de mantener los índices actualizados es alta.
Cuando el optimizador considera un escaneo de tabla completo [3]
El factor más importante a la hora de elegir depende de la velocidad. Esto significa que se debe usar un escaneo de tabla completo cuando es el más rápido y no se puede usar una ruta de acceso diferente. A continuación se muestran varios ejemplos de escaneo de tabla completa.
- Sin índice
El optimizador debe utilizar un escaneo de tabla completo ya que no existe ningún índice.
- Pequeño número de filas
El costo del escaneo de tabla completa es menor que el escaneo de rango de índice debido a la pequeña mesa.
- Cuando se procesó la consulta SELECT COUNT (*), existían nulos en la columna
La consulta cuenta 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 de 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 mesa tiene un alto grado de paralelismo.
El alto grado de paralelismo de la tabla distorsiona el optimizador de una manera verdadera, porque el optimizador usaría el escaneo de tabla completo.
- Una sugerencia de escaneo de tabla completa
La sugerencia permite al optimizador utilizar el escaneo completo de la tabla.
Ejemplos de
El primer ejemplo muestra una declaración SQL que devuelve el nombre de cada fruta en la tabla de frutas cuyo color es rojo. Si la tabla de frutas no tiene un índice para la columna de color, entonces el motor de la base de datos debe cargar y examinar cada fila dentro de las frutas para comparar el color de cada fila con 'rojo':
SELECCIONAR nombre DE frutas DONDE color = 'rojo';
El segundo ejemplo muestra una declaración SQL que devuelve el nombre de todas las frutas en la tabla de frutas. Debido a que esta declaración no tiene ninguna condición, no hay cláusula WHERE, el motor de la base de datos utilizará un escaneo de tabla para cargar y devolver los datos para esta consulta incluso si la tabla de frutas tiene un índice en la columna de nombre porque el acceso, es decir, el escaneo, la tabla directamente es más rápido que acceder a la tabla 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 certeza hará que el motor sql use un índice en lugar de un escaneo de tabla. Este ejemplo usa casi la misma consulta que la anterior, pero agrega una cláusula ORDER BY para que los nombres devueltos estén en orden alfabético. Suponiendo que la tabla de frutas tiene un índice en la columna de nombre, el motor de la base de datos ahora usará ese índice para devolver los nombres en orden porque acceder a la tabla a través de la capa de abstracción adicional del índice proporciona el beneficio de devolver las filas en el orden solicitado. . Si el motor hubiera cargado las filas usando un escaneo de tabla, entonces tendría que realizar el trabajo adicional de ordenar las filas devueltas. En algunos casos extremos, por ejemplo, las estadísticas mantenidas por el motor de la base de datos indican que la tabla contiene una cantidad muy pequeña de filas, el optimizador aún puede decidir usar un escaneo de tabla para este tipo de consulta:
SELECCIONAR nombre DE frutas PEDIR POR nombre
Pros y contras
Pros:
- El costo es predecible, ya que cada vez que el sistema de base de datos necesita escanear la tabla completa fila por fila.
- Cuando la tabla ocupa menos del 2 por ciento del búfer de bloques de la base de datos, la tabla de exploración completa es más rápida.
Contras:
- La exploración completa de la tabla se produce cuando no hay índice o SQL no está utilizando el índice . Y el resultado de una tabla de exploración completa suele ser más lento que la exploración de la tabla de índice. La situación es que: cuanto más grande es la tabla, más lento es el retorno de los datos.
- El escaneo de tabla completa innecesario conducirá a una gran cantidad de E / S innecesarias con una carga de proceso en toda la base de datos.
Ver también
Referencias
- ^ "Evitar escaneos de tablas" . Oráculo. 2011.
- ^ "¿Qué es más rápido: acceso al índice o escaneo de tablas?" . Microsoft TechNet. 2002.
- ^ "Rutas de acceso al optimizador" . Oráculo. 2013.