Práctica de almacenamiento de datos: cuello de botella en el rendimiento causado por demasiadas filas filtradas durante el escaneo de la tabla

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]

imagen.png
imagen.png
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)

imagen.png

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.

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"
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4526289/blog/10141543
Recomendado
Clasificación