Data-Warehouse-Praxis: Leistungsengpass durch zu viele gefilterte Zeilen während des Tabellenscans

Dieser Artikel wurde von der Huawei Cloud Community geteilt: „ GaussDB (DWS) Performance Tuning: A Case Study of Performance Bottleneck Problems Caused by Excessive Number of Filtered Rows While Table Scans “ von O Paoguola~.

1. [Problembeschreibung]

Während der Ausführung der SQL-Anweisung wird eine große Tabelle mit einem Datenvolumen von 1,2 Milliarden gescannt und 99 % der Daten werden gefiltert, sodass nur 617 Datenzeilen übrig bleiben. Der Leistungsengpass liegt beim Scannen der Tabelle.

2. [Ursprüngliche Aussage]

set search_path = 'bi_dashboard'; 

WITH F_SRV_DB_DIM_PRD_D AS (SELECT EXTERNAL_NAME FROM ( SELECT MKT_NAME EXTERNAL_NAME   
		       FROM BI_DASHBOARD.DM_MSS_ITEM_PRODUCT_D PRD 
		      WHERE PRD.COMPANY_BRAND =any(array[string_to_array('HUAWEI',',')]) 
		            
	          AND PRD .MKT_NAME =any (array[string_to_array('Genießen Sie 60, Genießen Sie 50, Genießen Sie 60X, Genießen Sie 60 Pro, Genießen Sie 50 Pro, Genießen Sie 50z, Nova 10z, Genießen Sie 20e, Genießen Sie 20 Pro, Genießen Sie 10e, Genießen Sie 10 Plus, Genießen Sie 20 SE, Genießen Sie 10, nova 11i, Genießen Sie 20 Plus, Genießen Sie 9 Plus, Genießen Sie 20 5G, nova Y90, Genießen 10S, nova Y70, Genießen Z, Genießen 9S, nova 8 SE Active Edition, Maimang 9 5G, Y9s, Maimang 9 5G',',' )]) ) 
	            WHERE EXTERNAL_NAME<>'SNULL' GROUP BY EXTERNAL_NAME), 

V_PERIOD AS 
 ( 
  SELECT PERIOD_ID AS PERIOD_ID_M, 
         LEAST(TO_CHAR(PERIOD_END_DATE, 'YYYYMMDD '), '20230630') AS PERIOD_ID, 
         PERIOD_ID AS DATEN 
    AUS BI_DASHBOARD.RPT_TML_ACCOUNT 
   _PERIOD_D WO PERIOD_TYPE = 'M' 
     AND PERIOD_ID BETWEEN 202207 AND 202306 
 ), 
 
V_DATA_BASE AS 
 ( 
  SELECT A.PERIOD_ID, 
         IFNULL(A.CHANNEL_ NAME, 'SNULL') AS 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 
 select count(*) FROM DM_MSS_CN_PC_REP_RP_ST_D_F A 
   INNER JOIN F_SRV_DB_DIM_PRD_D PRD 
      ON A.EXTERNAL_NAME = PRD.EXTERNAL_NAME 
   WHERE 1 = 1 
     AND A.CHANNEL_ID IN ('100013 388802') 
     UND A.ORG_KEY IN (10000651) 
    
     UND A.SALES_FLAG IN ('1', '0') 
     UND A.PERIOD_ID IN (20220731,20221031,20220930,20220831,20221130, 20221231,20230131,20230228,20230430,20 230331,20230531,20230630) 
     UND (A .SO_QTY_MTD <> 0) – Alle Daten filtern, deren Datum SO_QTY 0 ist. 
   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 
    FROM V_DATA_BASE A 
   GROUP BY GROUPING SETS ((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'), ',' ORDER BY P.PERIOD_ID_M ) AS SO_QTY 
    FROM V_PERIOD P 
    FULL JOIN (SELECT DISTINCT DISTRIBUTOR_CHANNEL_NAME FROM V_DATA) B 
      ON 1 = 1 
    LINKS JOIN V_DATA A 
      ON A.PERIOD_ID = P.PERIOD_ID 
     UND A.DISTRIBUTOR_CHANNEL_NAME = B.DISTRIBUTOR_CHANNEL_NAME
   GROUP BY B.DISTRIBUTOR_CHANNEL_NAME 
   ORDER BY DECODE(B.DISTRIBUTOR_CHANNEL_NAME, 'Total', 0, 'SOURCE IS NULL', 2, '源为空', 3, 'SNULL', 4, 1), SUM(A.SO_QTY_ORDER 
            ) DESC NULLS LAST 
   LIMIT 50 OFFSET 0

3. [Leistungsanalyse]

Bild.png
Bild.png
Wie aus dem Leistungsausführungsplan in der Abbildung oben ersichtlich ist (der vollständige Ausführungsplan befindet sich in Anhang 1), ist die SQL-Anweisung beim Scannen von Tabelle a (bi_dashboard.dm_mss_cn_pc_rep_rp_st_d_f_test) langsam. Zu den Filterbedingungen beim Scannen gehören: sales_flag, so_qty_mtd, channel_id, org_key, period_id. Der ursprüngliche lokale Clustering-Schlüssel PCK in der Tabelle enthält nur period_id und keine der anderen drei Filterbedingungen. Daher kann der PCK zur Reduzierung angepasst werden Ausführungszeit der Scantabelle a.

Ergänzung: lokaler Clustering-Schlüssel

Partial Cluster Key (PCK) ist eine Indextechnologie unter der Spaltenspeicherung, die Min/Max-Sparse-Indizes verwendet, um ein schnelles Scannen von Basistabellen zu erreichen. Der Teilclusterschlüssel kann mehrere Spalten angeben, es wird jedoch im Allgemeinen nicht empfohlen, mehr als 2 Spalten zu verwenden. PCK eignet sich zur Beschleunigung von Punktabfragen für große, in Spalten gespeicherte Tabellen.

Darüber hinaus gibt es viele in-Werte (12) in der where-Bedingung in der View-Anweisung. In DWS können die Bedingungen nach in standardmäßig nur 5 sein. Wenn es mehr als 6 gibt, wird die Filterung nicht nach unten gedrückt . Zu diesem Zeitpunkt können Sie oder verwenden, um die Umschreibung von 12 Werten zu kombinieren.

A.PERIOD_ID IN (20220731,20221031,20220930,20220831,20221130) 
oder A.PERIOD_ID IN (20221231,20230131,20230228,20230430,20230331) 
oder A.PERIOD_ID IN (202 30531,20230630)

Bild.png

Zu diesem Zeitpunkt wird die Ausführungszeit der SQL-Anweisung auf 487 ms reduziert, und der vollständige Leistungsplan ist in Anhang 2 dargestellt.

Klicken Sie hier, um zu folgen und so schnell wie möglich mehr über die neuen Technologien von Huawei Cloud zu erfahren~

Alibaba Cloud erlitt einen schwerwiegenden Ausfall und alle Produkte waren betroffen (wiederhergestellt). Tumblr hat das russische Betriebssystem Aurora OS 5.0 abgekühlt . Neue Benutzeroberfläche vorgestellt : Delphi 12 & C++ Builder 12, RAD Studio 12. Viele Internetunternehmen stellen dringend Hongmeng-Programmierer ein. UNIX-Zeit steht kurz vor dem Eintritt in die 1,7-Milliarden-Ära (bereits eingetreten). Meituan rekrutiert Truppen und plant die Entwicklung der Hongmeng-System-App. Amazon entwickelt ein Linux-basiertes Betriebssystem, um die Abhängigkeit von Android von .NET 8 unter Linux zu beseitigen. Die unabhängige Größe ist um 50 % reduziert. FFmpeg 6.1 „Heaviside“ ist erschienen
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/4526289/blog/10141543
Empfohlen
Rangfolge