Este artículo se comparte desde la comunidad de la nube de Huawei " Ajuste del rendimiento de GaussDB (DWS): un estudio de caso de problemas de cuello de botella en el rendimiento causados por un número excesivo de filas filtradas durante los escaneos de tablas " por O Paoguolai~.
1. [Descripción del problema]
Durante la ejecución de la declaración SQL, se escanea una tabla grande con un volumen de datos de 1,2 mil millones y se filtra el 99% de los datos, dejando solo 617 filas de datos.El cuello de botella en el rendimiento radica en el escaneo de la tabla.
2. [Declaración original]
set search_path = 'bi_dashboard ' ; con F_SRV_DB_DIM_PRD_D (array[string_to_array('Disfruta 60, Disfruta 50, Disfruta 60X, Disfruta 60 Pro, Disfruta 50 Pro, Disfruta 50z, nova 10z, Disfruta 20e, Disfruta 20 Pro, Disfruta 10e, Disfruta 10 Plus, Disfruta 20 SE, Disfruta 10, nova 11i, Disfruta 20 Plus, Disfruta 9 Plus, Disfruta 20 5G, nova Y90, Disfruta 10S, nova Y70, Disfruta Z, Disfruta 9S, nova 8 SE Active Edition, Maimang 9 5G, Y9s, Maimang 9 5G',',' )]) ) DONDE EXTERNAL_NAME<>'SNULL' GROUP BY EXTERNAL_NAME), V_PERIOD AS ( SELECCIONE PERIOD_ID COMO PERIOD_ID_M, MENOS (TO_CHAR(PERIOD_END_DATE, 'AAAAMMDD '), '20230630') COMO PERIOD_ID, PERIOD_ID COMO FECHAS DE BI_DASHBOARD.RPT_TML_ACCOUNT_PER IOD_D DONDE PERIOD_TYPE = 'M' AND PERIOD_ID ENTRE 202207 Y 202306 ), V_DATA_BASE AS ( SELECCIONE A.PERIOD_ID, IFNULL(A.CHANNEL_ NAME, 'SNULL') COMO DISTRIBUTOR_CHANNEL_NAME, SUM(A.SO_QTY_MTD) AS SO_QTY, SUM(DECODE(A. PERIOD_ID, 20230630, A.SO_QTY_MTD)) AS SO_QTY_ORDER seleccione recuento (*) DESDE DM_MSS_CN_PC_REP_RP_ST_D_F UNA UNIÓN INTERNA F_SRV_DB_DIM_PRD_D PRD EN A.EXTERNAL_NAME = PRD.EXTERNAL_NAME DONDE 1 = 1 Y A.CHANNEL_ID IN ('10 0013388802') Y A.ORG_KEY IN (10000651) Y A.SALES_FLAG EN ('1', '0') Y A.PERIOD_ID EN (20220731,20221031,20220930,20220831,20221130, 20221231,20230131,20230228,20230430,20 230331,20230531,20230630) Y (A .SO_QTY_MTD <> 0) - Filtra todos los datos cuya fecha SO_QTY es 0 GROUP BY A.PERIOD_ID, IFNULL(A.CHANNEL_NAME, 'SNULL' ) ), V_DATA AS ( SELECT PERIOD_ID, NVL(DISTRIBUTOR_CHANNEL_NAME, 'Total') AS DISTRIBUTOR_CHANNEL_NAME , SUM(SO_QTY) AS SO_QTY, SUM(SO_QTY_ORDER) AS SO_QTY_ORDER DESDE V_DATA_BASE UN GRUPO POR CONJUNTOS DE AGRUPACIÓN ((PERIOD_ID), (PERIOD_ID, DISTRI BUTOR_CHANNEL_NAME)) ) SELECT STRING_AGG(P.DATES, ',' ORDER BY P.PERIOD_ID_M) AS PERIOD_LIST, B.DISTRIBUTOR_CHANNEL_NAME, STRING_AGG(NVL(TO_CHAR(ROUND(A.SO_QTY)), '0'), ',' ORDENAR POR P.PERIOD_ID_M) COMO SO_QTY DESDE V_PERIOD P UNIÓN COMPLETA (SELECCIONE DISTINTO DISTRIBUTOR_CHANNEL_NAME DE V_DATA) B EN 1 = 1 UNIRSE A LA IZQUIERDA V_DATA A EN A.PERIOD_ID = P.PERIOD_ID AND A.DISTRIBUTOR_CHANNEL_NAME = B.DISTRIBUTOR_CHANNEL_NAME GRUPO POR B.DISTRIBUTOR_CHANNEL_NAME ORDEN POR DECODIFICACIÓN (B.DISTRIBUTOR_CHANNEL_NAME, 'Total', 0, 'SOURCE IS NULL', 2, '源为空', 3, 'SNULL', 4, 1), SUM(A.SO_QTY_ORDER) DESC NULLS ÚLTIMO LÍMITE 50 COMPENSACIÓN 0
3. [Análisis de rendimiento]
Como se puede ver en el plan de ejecución del rendimiento en la figura anterior (el plan de ejecución completo se encuentra en el Apéndice 1), la instrucción SQL escanea la tabla a con lentitud (bi_dashboard.dm_mss_cn_pc_rep_rp_st_d_f_test). Las condiciones de filtro durante el escaneo incluyen: sales_flag, so_qty_mtd, channel_id, org_key, period_id. La clave de agrupación local original PCK en la tabla solo contiene period_id y no incluye ninguna de las otras tres condiciones de filtro. Por lo tanto, la PCK se puede ajustar para reducir Tiempo de ejecución de la tabla de escaneo a.
Suplemento: clave de agrupación local
La clave de clúster parcial (PCK) es una tecnología de índice bajo almacenamiento de columnas que utiliza índices dispersos mínimo/máximo para lograr un escaneo rápido de las tablas base. La clave de clúster parcial puede especificar varias columnas, pero generalmente no se recomienda exceder las 2 columnas. PCK es adecuado para acelerar consultas puntuales en tablas grandes almacenadas en columnas.Además, hay muchos valores in (12) en la condición donde en la declaración de vista. En DWS, las condiciones después de in solo pueden ser 5 de forma predeterminada. Si hay más de 6, el filtrado no se reducirá. En este momento, puedes usar o combinar la reescritura de 12 valores,
A.PERIOD_ID EN (20220731,20221031,20220930,20220831,20221130) o A.PERIOD_ID EN (20221231,20230131,20230228,20230430,20230331) o A.PERIOD_ID EN (202 30531,20230630)
En este momento, el tiempo de ejecución de la declaración SQL se reduce a 487 ms y el plan de rendimiento completo se muestra en el Apéndice 2.
- Adjunto: Después de la optimización: performance.txt 466,64 KB
- Adjunto: Antes de la optimización: performance.txt 449,47 KB
Haga clic para seguir y conocer las nuevas tecnologías de Huawei Cloud lo antes posible ~
Alibaba Cloud sufrió un fallo grave y todos los productos se vieron afectados (restaurados). Tumblr enfrió el sistema operativo ruso Aurora OS 5.0. Se presentó la nueva interfaz de usuario Delphi 12 y C++ Builder 12, RAD Studio 12. Muchas empresas de Internet contratan urgentemente programadores de Hongmeng. Tiempo UNIX está a punto de entrar en la era de los 1.700 millones (ya entró). Meituan recluta tropas y planea desarrollar la aplicación del sistema Hongmeng. Amazon desarrolla un sistema operativo basado en Linux para deshacerse de la dependencia de Android de .NET 8 en Linux. El tamaño independiente es reducido en un 50%. Se lanza FFmpeg 6.1 "Heaviside"