Articulo de referencia

Optimización de consultas

La optimización de consultas es una característica de muchos sistemas de gestión de bases de datos relacionales y otras bases de datos, como las bases de datos NoSQL y las de gr...

La optimización de consultas es una característica de muchos sistemas de gestión de bases de datos relacionales y otras bases de datos, como las bases de datos NoSQL y las de grafos . El optimizador de consultas intenta determinar la forma más eficiente de ejecutar una consulta dada, considerando los posibles planes de consulta . [ 1 ]

Generalmente, los usuarios no pueden acceder directamente al optimizador de consultas: una vez que las consultas se envían al servidor de la base de datos y son analizadas por el analizador, se pasan al optimizador de consultas donde se realiza la optimización. [ 2 ] [ 3 ] Sin embargo, algunos motores de bases de datos permiten guiar al optimizador de consultas con sugerencias .

Una consulta es una solicitud de información a una base de datos. Puede ser tan simple como "encontrar la dirección de una persona con el número de Seguro Social 123-45-6789" o más compleja como "encontrar el salario promedio de todos los hombres casados ​​empleados en California entre 30 y 39 años que ganan menos que sus cónyuges". El resultado de una consulta se genera procesando las filas de una base de datos de manera que se obtenga la información solicitada. Dado que las estructuras de las bases de datos son complejas, en la mayoría de los casos, y especialmente para consultas no muy simples, los datos necesarios para una consulta se pueden recopilar de una base de datos accediendo a ella de diferentes maneras, a través de diferentes estructuras de datos y en diferentes órdenes. [ 4 ] Cada método diferente generalmente requiere un tiempo de procesamiento distinto. Los tiempos de procesamiento de una misma consulta pueden variar considerablemente, desde una fracción de segundo hasta horas, dependiendo del método elegido. El objetivo de la optimización de consultas, que es un proceso automatizado, es encontrar la manera de procesar una consulta determinada en el menor tiempo posible. La gran variabilidad posible en el tiempo justifica la optimización de consultas, aunque encontrar el plan de consulta óptimo exacto entre todas las posibilidades suele ser muy complejo, requiere mucho tiempo, puede resultar demasiado costoso y, a menudo, es prácticamente imposible. Por lo tanto, la optimización de consultas generalmente intenta aproximarse al óptimo comparando varias alternativas lógicas para proporcionar, en un tiempo razonable, un plan suficientemente bueno que normalmente no se desvíe mucho del mejor resultado posible.

Consideraciones generales

Existe una compensación entre el tiempo empleado en determinar el mejor plan de consulta y la calidad de la elección; el optimizador puede no elegir la mejor respuesta por sí solo. Los sistemas de gestión de bases de datos de distinta calidad tienen diferentes maneras de equilibrar estos dos aspectos. Los optimizadores de consultas basados ​​en costos evalúan la huella de recursos de varios planes de consulta y la utilizan como base para la selección del plan. [ 5 ] [ 6 ] Estos asignan un "costo" estimado a cada plan de consulta posible y eligen el plan con el costo más pequeño. Los costos se utilizan para estimar el costo de tiempo de ejecución de la evaluación de la consulta, en términos del número de operaciones de E/S requeridas, la longitud de la ruta de la CPU , la cantidad de espacio de búfer de disco, el tiempo de servicio de almacenamiento en disco y el uso de interconexión entre unidades de paralelismo, y otros factores determinados a partir del diccionario de datos . El conjunto de planes de consulta examinados se forma examinando las posibles rutas de acceso (por ejemplo, acceso al índice primario, acceso al índice secundario, escaneo completo del archivo) y varias técnicas de unión de tablas relacionales (por ejemplo, unión por fusión , unión hash , unión de producto ). El espacio de búsqueda puede ser bastante amplio dependiendo de la complejidad de la consulta SQL . Existen dos tipos de optimización: la optimización lógica, que genera una secuencia de álgebra relacional para resolver la consulta, y la optimización física, que se utiliza para determinar la forma de realizar cada operación.

Implementación

La mayoría de los optimizadores de consultas representan los planes de consulta como un árbol de "nodos de plan". Un nodo de plan encapsula una única operación necesaria para ejecutar la consulta. Los nodos se organizan en forma de árbol, donde los resultados intermedios fluyen desde la base hasta la cima. Cada nodo tiene cero o más nodos hijos; estos son nodos cuya salida se utiliza como entrada para el nodo padre. Por ejemplo, un nodo de unión tendrá dos nodos hijos, que representan los dos operandos de unión, mientras que un nodo de ordenación tendrá un único nodo hijo (la entrada que se va a ordenar). Las hojas del árbol son los nodos que producen resultados mediante el escaneo del disco, por ejemplo, mediante un escaneo de índice o un escaneo secuencial.

Unirse al pedido

Un plan de consulta para la consulta triangular R(A, B) ⋈ S(B, C) ⋈ T(A, C) que utiliza uniones binarias. Primero une S y T, y luego une el resultado con R.
Un plan de consulta para la consulta triangular R(A, B) ⋈ S(B, C) ⋈ T(A, C) que utiliza uniones binarias. Primero une R y S, y luego une el resultado con T.
Dos posibles planes de consulta para la consulta triangular R(A, B) ⋈ S(B, C) ⋈ T(A, C) ; el primero une S y T primero y une el resultado con R , el segundo une R y S primero y une el resultado con T.

El rendimiento de un plan de consulta está determinado en gran medida por el orden en que se unen las tablas. Por ejemplo, al unir 3 tablas A, B y C de tamaño 10 filas, 10 000 filas y 1 000 000 filas, respectivamente, un plan de consulta que une B y C primero puede tardar varios órdenes de magnitud más en ejecutarse que uno que une A y C primero. La mayoría de los optimizadores de consultas determinan el orden de unión mediante un algoritmo de programación dinámica desarrollado por el proyecto de base de datos System R de IBM . Este algoritmo funciona en dos etapas:

  1. En primer lugar, se calculan todas las formas de acceder a cada relación en la consulta. Se puede acceder a cada relación mediante un escaneo secuencial. Si existe un índice en una relación que se puede usar para responder a un predicado en la consulta, también se puede usar un escaneo de índice. Para cada relación, el optimizador registra la forma más económica de escanearla, así como la forma más económica de escanearla que produce registros en un orden específico.
  2. El optimizador considera entonces combinar cada par de relaciones para las que existe una condición de unión. Para cada par, el optimizador considerará los algoritmos de unión disponibles implementados por el sistema de gestión de bases de datos (DBMS) . Conservará la forma más económica de unir cada par de relaciones, además de la forma más económica de unir cada par de relaciones que produzca su resultado según un orden de clasificación específico.
  3. A continuación, se calculan todos los planes de consulta de tres relaciones, uniendo cada plan de dos relaciones producido por la fase anterior con las relaciones restantes de la consulta.

El orden de clasificación puede evitar una operación de ordenación redundante más adelante al procesar la consulta. En segundo lugar, un orden de clasificación específico puede acelerar una unión posterior, ya que agrupa los datos de una manera particular.

Planificación de consultas para consultas SQL anidadas

Una consulta SQL en un sistema de gestión de bases de datos relacionales moderno realiza más que simples selecciones y uniones. En particular, las consultas SQL suelen anidar varias capas de bloques SPJ (Seleccionar-Proyectar-Unir) mediante los operadores GROUP BY , EXISTS y NOT EXISTS . En algunos casos, estas consultas SQL anidadas pueden simplificarse a una consulta de selección-proyección-unión, pero no siempre. Los planes de consulta para consultas SQL anidadas también pueden elegirse utilizando el mismo algoritmo de programación dinámica que se usa para la ordenación de uniones, pero esto puede provocar un aumento considerable en el tiempo de optimización de la consulta. Por ello, algunos sistemas de gestión de bases de datos utilizan un enfoque alternativo basado en reglas que emplea un modelo de grafo de consulta. [ 7 ]

Estimación de costos

Uno de los problemas más difíciles en la optimización de consultas es estimar con precisión los costos de los planes de consulta alternativos. Los optimizadores calculan el costo de los planes de consulta utilizando un modelo matemático de costos de ejecución que depende en gran medida de las estimaciones de la cardinalidad , o número de tuplas, que fluyen a través de cada arista en un plan de consulta. La estimación de la cardinalidad, a su vez, depende de las estimaciones del factor de selección de los predicados en la consulta. Tradicionalmente, los sistemas de bases de datos estiman las selectividades mediante estadísticas bastante detalladas sobre la distribución de valores en cada columna, como histogramas . Esta técnica funciona bien para estimar las selectividades de predicados individuales. Sin embargo, muchas consultas tienen conjunciones de predicados como . Los predicados de consulta a menudo están altamente correlacionados (por ejemplo, implica ), y es muy difícil estimar la selectividad de la conjunción en general. Las estimaciones de cardinalidad deficientes y la correlación no detectada son una de las principales razones por las que los optimizadores de consultas eligen planes de consulta deficientes. Esta es una razón por la que un administrador de bases de datos debe actualizar regularmente las estadísticas de la base de datos, especialmente después de cargas/descargas importantes de datos.selectcount(*)fromRwhereR.make='Honda'andR.model='Accord'model='Accord'make='Honda'

Extensiones

La optimización clásica de consultas asume que los planes de consulta se comparan según una única métrica de costo, generalmente el tiempo de ejecución, y que el costo de cada plan de consulta se puede calcular sin incertidumbre. En la práctica, ambas suposiciones a veces no se cumplen [ 8 ] , y en la literatura de investigación se han estudiado múltiples extensiones de la optimización clásica de consultas que superan estas limitaciones. Estas variantes extendidas del problema difieren en cómo modelan el costo de los planes de consulta individuales y en términos de su objetivo de optimización.

Optimización de consultas paramétricas

La optimización clásica de consultas asocia cada plan de consulta con un valor de coste escalar. La optimización paramétrica de consultas [ 9 ] supone que el coste del plan de consulta depende de parámetros cuyos valores se desconocen en el momento de la optimización. Dichos parámetros pueden representar, por ejemplo, la selectividad de los predicados de consulta que no se especifican completamente en el momento de la optimización, pero que se proporcionarán en el momento de la ejecución. Por lo tanto, la optimización paramétrica de consultas asocia cada plan de consulta con una función de coste que mapea un espacio de parámetros multidimensional a un espacio de coste unidimensional.

El objetivo de la optimización suele ser generar todos los planes de consulta que podrían ser óptimos para cualquier combinación posible de valores de parámetros. Esto da como resultado un conjunto de planes de consulta relevantes. En tiempo de ejecución, se selecciona el mejor plan de ese conjunto una vez que se conocen los valores reales de los parámetros. La ventaja de la optimización de consultas paramétricas es que se evita la optimización (que generalmente es una operación muy costosa) en tiempo de ejecución.

Optimización de consultas multiobjetivo

Además del tiempo de ejecución, a menudo existen otras métricas de coste relevantes para comparar planes de consulta. En un entorno de computación en la nube , por ejemplo, conviene comparar los planes de consulta no solo en función del tiempo de ejecución, sino también de su coste. Asimismo, en el contexto de la optimización aproximada de consultas, es posible ejecutar planes de consulta en muestras seleccionadas aleatoriamente de los datos de entrada para obtener resultados aproximados con una menor sobrecarga de ejecución. En estos casos, es necesario comparar los planes de consulta alternativos no solo en función de su tiempo de ejecución, sino también de la precisión o fiabilidad de los datos que generan.

La optimización de consultas multiobjetivo [ 10 ] modela el costo de un plan de consulta como un vector de costos, donde cada componente del vector representa el costo según una métrica de costo diferente. La optimización de consultas clásica puede considerarse un caso especial de optimización de consultas multiobjetivo, donde la dimensión del espacio de costos (es decir, el número de componentes del vector de costos) es uno.

Las distintas métricas de coste pueden entrar en conflicto entre sí (por ejemplo, en un escenario de computación en la nube, puede haber un plan con un tiempo de ejecución mínimo y otro con costes de ejecución mínimos). Por lo tanto, el objetivo de la optimización no puede ser encontrar un plan de consulta que minimice todas las métricas de coste, sino encontrar un plan que logre el mejor equilibrio entre ellas. Este equilibrio óptimo depende de las preferencias del usuario (por ejemplo, en un escenario de nube, algunos usuarios pueden preferir un plan más económico, mientras que otros prefieren uno más rápido). El objetivo de la optimización consiste, por lo tanto, en encontrar el mejor plan de consulta en función de las preferencias del usuario, proporcionadas como entrada al optimizador (por ejemplo, los usuarios pueden definir ponderaciones entre diferentes métricas de coste para expresar su importancia relativa o establecer límites de coste estrictos para ciertas métricas), o bien en generar una aproximación del conjunto de planes de consulta óptimos de Pareto (es decir, planes en los que ningún otro plan tiene un coste mejor según todas las métricas), de modo que el usuario pueda seleccionar la opción de coste que prefiera dentro de ese conjunto de planes.

Optimización de consultas paramétricas multiobjetivo

La optimización paramétrica de consultas multiobjetivo [ 8 ] generaliza la optimización paramétrica y multiobjetivo de consultas. Los planes se comparan según múltiples métricas de costo, y estos costos pueden depender de parámetros cuyos valores se desconocen al momento de la optimización. Por lo tanto, el costo de un plan de consulta se modela como una función de un espacio de parámetros multidimensional a un espacio de costos multidimensional. El objetivo de la optimización es generar el conjunto de planes de consulta que resulten óptimos para cada posible combinación de valores de parámetros y preferencias del usuario.

Varias herramientas muestran planes de ejecución de consultas para identificar las operaciones con mayor coste de procesamiento. Microsoft SMS, ApexSQLPlan, Hana y Tableau son algunos ejemplos. Solucionar los problemas detectados en estos planes puede reducir el tiempo de ejecución en decenas de puntos porcentuales y, en algunos casos, convertir búsquedas bidimensionales en lineales.

Una de las listas de verificación de optimización primarias y más simples es usar operaciones que la mayoría de los sistemas de gestión de bases de datos relacionales (RDBMS) están diseñados para ejecutar de manera eficiente. Ver Sargable .

Véase también

Referencias

  1. " Centro de conocimiento de IBM" . www.ibm.com
  2. Ioannidis, Yannis (marzo de 1996). "Optimización de consultas" . ACM Computing Surveys . 28 (1): 121– 123. doi : 10.1145/234313.234367 . S2CID 47190708 . 
  3. Chaudhuri, Surajit (1998). "Una visión general de la optimización de consultas en sistemas relacionales" . Actas del Simposio ACM sobre Principios de Sistemas de Bases de Datos . págs. 34–43 . doi : 10.1145/275487.275492 . 
  4. Selinger, PG ; Astrahan, MM; Chamberlin, DD ; Lorie, RA; Price, TG (1979). "Selección de ruta de acceso en un sistema de gestión de bases de datos relacionales". Actas de la Conferencia Internacional ACM SIGMOD de 1979 sobre Gestión de Datos . págs. 23–34 . doi : 10.1145/582095.582099 . ISBN  089791001X.
  5. " Optimización basada en costos de Oracle SQL" . www.dba-oracle.com
  6. "Arquitecto NoSQL: Modelado de datos/optimización de consultas para DynamoDB" . volisoft.org .
  7. "EXPLAIN QUERY PLAN" . www.sqlite.org .
  8. 1 2 Trummer, Immanuel; Koch, Christoph (2015). "Optimización de consultas paramétricas multiobjetivo" . ACM SIGMOD Record . 45 : 221–232 . doi : 10.1145/2949741.2949748 .
  9. Ioannidis, Yannis; Ng, Raymond T.; Shim, Kyuseok; Sellis, Timos K. (1997). "Optimización de consultas paramétricas". The VLDB Journal the International Journal on Very Large Data Bases . 6 (2): 132– 151. CiteSeerX 10.1.1.33.696 . doi : 10.1007/s007780050037 . S2CID 3060505 .  
  10. Trummer, Immanuel; Koch, Christoph (2014). Esquemas de aproximación para la optimización de consultas multiobjetivo . SIGMOD. pp. 1299– 1310. arXiv : 1404.0046 .