Explicar el pq_distribute de ORACLE-HINT

Explain Pq_distribute Oracle Hint

Esta vez para explicarte una pista novedosa:

pq_distribute (nombre de tabla, distribución_exterior distribución_interior)
Traducción personal: sugerencia de consulta en paralelo para mejorar el rendimiento de la conexión en paralelo
Documentación oficial:
La sugerencia PQ_DISTRIBUTE indica al optimizador cómo distribuir filas de tablas unidas entre productores
y servidores de consultas de consumidores. Dicha distribución puede mejorar el rendimiento de las operaciones de combinación en paralelo.
tablename como sugiere el nombre
external_distribution estado de distribución de la tabla del anillo exterior
inner_distribution estado de distribución de la tabla de bucle interno



Los valores del estado de distribución son HASH, BROADCAST, PARTITION y NONE.
Solo las siguientes seis distribuciones de tablas combinadas son válidas:



1. 【HASH , HASH】
Asigna las filas de cada tabla al servidor de consultas del consumidor mediante la función hash en la clave de conexión. Una vez completado el mapeo,
Cada servidor de consultas realiza una conexión entre un par de particiones de resultados. Esta distribución se recomienda cuando el tamaño de la tabla es equivalente y la operación de combinación se implementa a través de una combinación de hash o una combinación de combinación de ordenación.
2.DIFUSIÓN, NINGUNO
Todas las filas de la tabla externa se difunden a cada servidor de consultas. Las filas internas de la tabla se dividen aleatoriamente.
Se recomienda esta distribución cuando la apariencia es muy pequeña en comparación con la mesa interior. Como regla general, use esta distribución cuando el tamaño de la tabla interna se multiplique por el número de servidores de consultas que sea mayor que el tamaño de la tabla externa.
3.NINGUNO, DIFUSIÓN
Todas las líneas de la tabla interna se transmiten a cada servidor de consultas de usuario. La fila exterior está dividida al azar.
Se recomienda esta distribución cuando la mesa interior es muy pequeña en comparación con la mesa exterior. Como regla general, use esta distribución cuando el tamaño de la tabla interna se multiplique por el número de servidores de consultas que sea menor que el tamaño de la tabla externa.
4.NINGUNO, PARTICIÓN
usa la partición de la tabla externa para mapear las filas de la tabla interna. La tabla externa debe dividirse en la clave de conexión. Se recomienda esta distribución cuando el número de particiones en la tabla externa es igual o casi igual al número de servidores de consultas, por ejemplo, 14 particiones y 15 servidores de consultas.



Nota: El optimizador ignora este mensaje si la tabla externa no está particionada o dividida por la mitad en la clave de partición.
5.NINGUNO, PARTICIÓN
usa la partición de la tabla externa para mapear las filas de la tabla interna. La tabla externa debe dividirse en la clave de conexión. Se recomienda esta distribución cuando el número de particiones en la tabla externa es igual o casi igual al número de servidores de consultas, por ejemplo, 14 particiones y 15 servidores de consultas.

Nota: El optimizador ignora este mensaje si la tabla externa no está particionada o dividida por la mitad en la clave de partición.
6.NINGUNO , NINGUNO
Cada servidor de consultas realiza una operación de unión entre un par de particiones coincidentes, una para cada tabla. Ambas tablas deben dividirse por igual en las claves de conexión.

Estuche para documentos oficiales:
Por ejemplo, dadas dos tablas rys que usan una combinación hash, la siguiente consulta contiene sugerencias que usan una distribución hash:



SELECT / * + PQ_DISTRIBUTE ORDERED (s HASH , HASH) USE_HASH (s) * / column_list
DESDE r , s
DONDE rc = sc

Para difundir una tabla externa r, la consulta es:

SELECT / * + ORDERED PQ_DISTRIBUTE (s BROADCAST , NONE) USE_HASH (s) * / column_list
DESDE r , s
DONDE rc = sc

De hecho, encontré un caso (material negativo):

(En lo que respecta a la confidencialidad, se han realizado algunas modificaciones y todos pueden ver principalmente HINT y el plan de ejecución):

Se puede ver que el plan de ejecución es obviamente incorrecto. En realidad, la NL vuelve a tener un hash y el tiempo es tan alto como 132+ (aunque no está permitido, pero el número es demasiado grande, debe ser problemático)
El jugador que escribió este SQL es obviamente una operación complicada. Parece tan largo que la pista es muy NB, el efecto real es de más de 240 segundos.

Primero elimine la sugerencia y descubra que hay una conversión de índice de mapa de bits, pero la velocidad aún alcanza 100S +

Desactive la conversión de índice de mapa de bits,

Realmente ejecutando 5S +, la velocidad se ha mejorado significativamente.

Se puede ver que la pista no debe jugarse de manera casual, especialmente cuando se trata de paralelismo. A veces no es que le añadas un buen efecto, es una advertencia.