Estrategia de reorden de unión de Databend

Autor: Wang Xudong

Ingeniero I+D de Databend

https://github.com/xudong963

Importancia del orden de unión

El orden de unión se refiere a determinar el orden en el que se unen varias tablas al ejecutar una consulta SQL. Es un aspecto importante de la optimización de consultas de bases de datos y tiene un impacto importante en el rendimiento y la eficiencia de las consultas. Diferentes órdenes de unión pueden tener un impacto de orden de magnitud en el rendimiento.

El optimizador optimiza el proceso central de orden de unión.

  1. unirse a la enumeración del plan
  2. Estimar el tamaño del resultado basándose en información estadística (estimación de cardinalidad)
  3. Lleve los resultados de 2 al modelo de costos para calcular el costo del plan de enumeración (modelo de costos)

En este artículo, solo nos preocupamos por el primer paso de la enumeración del plan de unión, que es el algoritmo de reordenación de unión.

unirse al algoritmo de reordenación

Algoritmo heurístico codicioso

Cuando hay demasiadas tablas que deben unirse (generalmente más de 10), el algoritmo codicioso es adecuado, su ventaja es que puede encontrar rápidamente un buen orden de unión.

Idea central: expandir de una tabla a N tablas, seleccionar una tabla que minimice el costo actual cada vez, agregarla al árbol de unión y construir un árbol profundo a la izquierda.

El algoritmo codicioso también tiene muchas extensiones: los principales puntos de extensión son cómo evitar la optimización local y generar árboles tupidos.

Algoritmo de enumeración (de arriba hacia abajo y de abajo hacia arriba)

Dos corrientes principales

  • La enumeración de arriba hacia abajo basada en la transformación de reglas se puede implementar de manera memorizada junto con el marco de cascada de arriba hacia abajo.
  • La enumeración ascendente basada en DP, un representante típico del algoritmo DPhyp, tiene la ventaja de generar árboles tupidos de manera eficiente.

En circunstancias normales, el sistema de base de datos combinará efectivamente la codicia y la enumeración, de modo que cualquier número de uniones de tablas pueda obtener un orden de unión efectivo en un tiempo razonable.

Databend se une al status quo de reordenamiento

El optimizador de databend optimiza en función de reglas, y cada regla coincide con el subárbol en el plan hasta el patrón. Se divide principalmente en dos etapas, optimización heurística y optimización de costos basada en el marco de cascadas, y las dos etapas comparten un conjunto de reglas.

Una vez completada la optimización de la fase heurística, el algoritmo DPhyp se ejecutará en el plan optimizado para intentar obtener el orden de unión óptimo. Si la optimización Dphyp falla, se encontrará el árbol profundo a la izquierda óptimo en CBO. (Esto no se intenta en CBO.Optimización de árbol tupido, porque si Dphyp no pudo optimizar, intente realizar la optimización de árbol tupido en CBO, es probable que el espacio de búsqueda explote, como tpcds 64)

Actualmente, Databend no admite el algoritmo codicioso (la siguiente etapa de la hoja de ruta proporcionará soporte relevante para manejar casos extremos). Primero utilizará el algoritmo dphyp para obtener la solución óptima. Si dphyp falla (hay un patrón en la consulta que es no es adecuado para el algoritmo dphyper), el árbol de profundidad izquierda se obtendrá mediante la enumeración de arriba hacia abajo basada en la transformación de reglas en el marco de cascadas. Si el número de tablas es demasiado grande, como más de diez, parte de la búsqueda Se cederá espacio en el algoritmo dphyp para compensar.

La definición central y el algoritmo de Dphyp.

hipergrafo

Un hipergrafo es una tupla H = (V,E) que consta de un conjunto de nodos V y un conjunto de hiperbordes E, donde:

  1. V es un conjunto de nodos no vacío.
  2. E es un conjunto de hiperbordes, que es un par desordenado (u, v) de un subconjunto no vacío (u ⊂ V) y (v ⊂ V) de V, y satisface la condición adicional u∩v = ∅.

Con un hipergráfico, se pueden describir las conexiones entre múltiples nodos.

Para la figura anterior, su condición de unión es R1.a + R2.b + R3.c = R4.d + R5.e + R6.fpor lo que el hiperborde es{R1, R2, R3} — {R4, R5, R6}

par-csg-cmp

csg: subgrafo conectado (subgrafo conectado)

cmp: complemento conectado (par complementario conectado)

Si no hay intersección entre dos csg y hay una conexión de hiperborde, uno de ellos es el cmp del otro y los dos constituyen un par csg-cmp. El núcleo del algoritmo es enumerar todos los pares csg-cmp mediante recursividad sin duplicación par, encuentre el par csg-cmp que contiene todos los puntos con el costo más pequeño.

algoritmo

Núcleo del algoritmo: los nodos en el hipergráfico están ordenados y los nodos se iteran de atrás hacia adelante (decrecientemente). Cada nodo solo se considera a sí mismo y a los nodos posteriores (con un número de secuencia mayor) para encontrar posibles subgrafos conectados y sus conexiones. El gráfico complementario forma un par csg-cmp, y su costo se calcula y actualiza. Después de iterar hasta el nodo más pequeño, se obtendrá un par csg-cmp que contiene todos los puntos y el algoritmo finaliza.

Proceso algorítmico

  1. EmitCsg: Encuentra el subgrafo conectado complementario de {v}
    • a. Si lo encuentra, EmitCsgCmp
    • b.EnumerateCmpRec: subgrafo conectado complementario extendido
      • Si el subgrafo conectado complementario expandido puede formar un par csg-cmp con {v}, entonces EmitCsgCmp
      • Vuelve a b y continúa expandiéndote.
  2. EnumerateCsgRec: extensión {v}
    • a. Obtenga la {v'} expandida, ejecute 1 en {v'}
    • b. Regrese a 2 y continúe expandiéndose

Para obtener definiciones de estructura de datos y código principal, consulte:

( https://github.com/datafuselabs/databend/blob/main/src/query/sql/src/planner/optimizer/hyper_dp/dphyp.rs )

Conéctate con nosotros

Databend es un nuevo almacén de datos de código abierto, flexible y de bajo costo basado en el almacenamiento de objetos que también puede realizar análisis en tiempo real. Esperamos contar con su atención y explorar juntos soluciones de almacenamiento de datos nativas de la nube para crear una nueva generación de nube de datos de código abierto.

El autor del marco de código abierto NanUI pasó a vender acero y el proyecto fue suspendido. La primera lista gratuita en la App Store de Apple es el software pornográfico TypeScript. Acaba de hacerse popular, ¿por qué los grandes empiezan a abandonarlo? Lista de octubre de TIOBE: Java tiene la mayor caída, C# se acerca Java Rust 1.73.0 lanzado Un hombre fue alentado por su novia AI a asesinar a la Reina de Inglaterra y fue sentenciado a nueve años de prisión Qt 6.6 publicado oficialmente Reuters: RISC-V La tecnología se convierte en la clave de la guerra tecnológica entre China y Estados Unidos. Nuevo campo de batalla RISC-V: no controlado por ninguna empresa o país, Lenovo planea lanzar una PC con Android.
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/5489811/blog/10116908
Recomendado
Clasificación