Cómo forzar a SQL a utilizar hash join con mejor rendimiento

Este artículo se comparte desde la comunidad de la nube de Huawei " [Optimización de SQL] Por qué a veces es imposible utilizar hashjoin con un mejor rendimiento de ejecución ", autor: jumpdb.

1. La unión hash suele ser mejor que la unión nestloop

Por lo general, la complejidad de la unión Nestloop es O (N cuadrado), y la complejidad temporal de la unión hash es O (N), por lo que generalmente tendemos a usar la unión hash.
 
En el proceso de ajuste del script SQL, generalmente hay dos formas de forzar el método de unión hash:

1. Desactive el modo Nestloop a nivel de sesión y configure enable_nesloop como desactivado;

2. Utilice el método /*+ hashjoin(ab) */ en SQL para unir mediante hash las tablas a y b;
 
CREAR BASE DE DATOS test_td CON DBCOMPATIBILITY='td'; 

crear tabla dim_day(day_code char(8)); 
cree la tabla dwr_rpo como seleccione fecha_actual - 1 como código_día; --返回了date类型

test_td=# \d+ dwr_rpo 
                       Tabla "public.dwr_rpo" 
  Columna | Tipo | Modificadores | Almacenamiento | Objetivo de estadísticas | Descripción 
-+------+-----------+---------+--------- -----+------------- 
 código_día | fecha | | llano | | 
Tiene OID: no 
Distribuir por: ROUND ROBIN 
Nodos de ubicación: TODOS LOS DATANODOS 
Opciones: orientación=fila, compresión=no 

explicar seleccionar * 
de dwr_rpo a 
unión izquierda dim_day c 
en c.day_code = a.day_code; 

identificación | operación | Filas electrónicas | E-distinto | Memoria electrónica | Ancho electrónico | Costos electrónicos     
---+------------------------------------------- ---+---------+------------+----------+---------+-- ------------ 
 1 | -> Streaming (tipo: GATHER) | 1310148 | | | 1694 | 279235196,70 
 2 | -> Unión izquierda de bucle anidado (3, 4) | 1310148 | | 1 MB | 1694 | 279229682.93 
 3 | -> Sec Scan en dwr_rpo a | 1310148 | | 1 MB | 1676 | 46589.16      
 4 | -> Materializar | 109575 | | 16 MB | 22 | 3747,76       
 5 | -> Streaming(tipo: TRANSMISIÓN) | 109575 | | 2 MB | 22 | 3565.146       
 | -> Sec Scan en dim_day c | 36525 | | 1 MB | 22 | 272.75        

               Información de predicado (identificada por identificación del plan)                 
----------------------------------------- ------------------------------------ 2 
        --Filtro 
  de unión a la izquierda de bucle anidado (3, 4) : ((c.day_code)::marca de tiempo sin zona horaria = a.day_code)

diagrama-de-sirena-2023-09-06-114052.png

Sin embargo, el SQL anterior no puede lograr una unión hash sin importar qué método se utilice. Necesitamos verificar si los tipos de datos en ambos extremos de la unión admiten la comparación hash.
 
 
1. ¿Por qué a veces es imposible utilizar hashjoin con mejor rendimiento?

Los diferentes tipos de datos tienen diferentes funciones de cálculo de hash y no se pueden realizar comparaciones de hash en tipos de datos incompatibles entre sí.

 
2. ¿Por qué hashjoin tarda unos segundos y nestloop dos horas?

Complejidad de Nestloop: 131w * 10w = 131 mil millones

Complejidad de hashjoin: 131w

Por tanto, existe una gran diferencia de rendimiento entre los dos métodos.
 
3. ¿Por qué no se puede unir hash aunque haya conversión de tipos?

Los tipos parecen similares, pero debido a las diferencias de precisión, formato, zona horaria, etc. en ambos extremos, no pueden considerarse directamente iguales.

4. ¿Qué tipos de datos no admiten hash en uniones?
seleccione oprname,oprkind,oprcanhash, 
  (seleccione typname de pg_type donde id=oprleft) oprleft, 
  (seleccione typname de pg_type donde oid=oprright) oprright 
de pg_operator 
donde oprname='=' y oprcanhash='f'; 

 nombre de operación | tipo de operación | oprcanhash | oprizquierda | derecho     
---------+---------+------------+---------------+ --------------- 
 = | segundo | f | xid | int8 
 = | segundo | f | xid32 | int4 
 = | segundo | f | tid | tiempo 
 = | segundo | f | caja | cuadro 
 = | segundo | f | camino | camino 
 = | segundo | f | tinterval | tinterval 
 = | segundo | f | dinero | dinero 
 = | segundo | f | circulo | círculo 
 = | segundo | f | lseg | lseg 
 = | segundo | f | línea | línea 
 = | segundo | f | poco | bit 
 = | segundo | f | varbit | varbit 
 = | segundo | f | fecha | marca de tiempo 
 = | segundo | f | fecha | marca de tiempo 
 = | segundo | f | marca de tiempo | fecha 
 = | segundo | f | marca de tiempo | fecha 
 = | segundo | f | marca de tiempo | marca de tiempo 
 = | segundo | f | marca de tiempo | marca de tiempo 
 = | segundo | f | tsvector | tsvector 
 = | segundo | f | tsquería | tsquery 
 = | segundo | f | registro | registro 
 = | segundo | f | hll | hll 
 = | segundo | f | hll_hashval | hll_hashval 
 = | segundo | f | mapa de bits rugiente | mapa de bits rugiente 
(24 filas)
 
La razón principal es que la marca de tiempo, la marca de tiempo y la fecha no pueden combinarse uniéndose entre sí. Otros tipos de datos son menos comunes.
 
Sugerencia de desarrollo: los tipos de datos en ambos extremos de la unión deben ser lo más consistentes o compatibles entre sí posible.
 
5. ¿Por qué no hay ningún problema con el modo de compatibilidad de Oracle, pero sí hay un problema con el modo de compatibilidad de td?

current_date es el tipo de fecha en el modo de compatibilidad TD;

current_date es del tipo de marca de tiempo en el modo de compatibilidad de Oracle;

 

Haga clic para seguir y conocer las nuevas tecnologías de Huawei Cloud lo antes posible ~

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/4526289/blog/10117402
Recomendado
Clasificación