數倉實踐丨表掃描時過濾行數過多引起的性能瓶頸問題

来源:https://www.cnblogs.com/huaweiyun/archive/2023/11/08/17816979.html
-Advertisement-
Play Games

本文分享自華為雲社區《GaussDB(DWS)性能調優:表掃描時過濾行數過多引起的性能瓶頸問題案例》,作者: O泡果奶~ 。 1、【問題描述】 SQL語句執行過程中,對12億數據量的大表進行掃描,過濾99%的數據僅留617行數據,性能瓶頸位於掃描該表這裡。 2、【原始語句】 set search_p ...


本文分享自華為雲社區《GaussDB(DWS)性能調優:表掃描時過濾行數過多引起的性能瓶頸問題案例》,作者: O泡果奶~ 。

1、【問題描述】

SQL語句執行過程中,對12億數據量的大表進行掃描,過濾99%的數據僅留617行數據,性能瓶頸位於掃描該表這裡。

2、【原始語句】

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('暢享 60,暢享 50,暢享 60X,暢享 60 Pro,暢享 50 Pro,暢享 50z,nova 10z,暢享 20e,暢享20 Pro,暢享 10e,暢享10 Plus,暢享20 SE,暢享10,nova 11i,暢享20 Plus,暢享9 Plus,暢享20 5G,nova Y90,暢享 10S,nova Y70,暢享Z,暢享 9S,nova 8 SE 活力版,麥芒9 5G,Y9s,麥芒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 DATES
    FROM BI_DASHBOARD.RPT_TML_ACCOUNT_PERIOD_D
   WHERE 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 ('100013388802') 
     AND A.ORG_KEY IN (10000651) 
    
     AND A.SALES_FLAG IN ('1', '0')
     AND A.PERIOD_ID IN (20220731,20221031,20220930,20220831,20221130,20221231,20230131,20230228,20230430,20230331,20230531,20230630)
     AND (A.SO_QTY_MTD <> 0) -- 過濾所有日期SO_QTY為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
    FROM V_DATA_BASE A
   GROUP BY GROUPING SETS ((PERIOD_ID), (PERIOD_ID, DISTRIBUTOR_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
    LEFT JOIN V_DATA A
      ON A.PERIOD_ID = P.PERIOD_ID
     AND 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、【性能分析】

image.png
image.png
從上圖的performance執行計劃中可以看出(完整執行計劃放在附件一),該SQL語句慢在掃描表a(bi_dashboard.dm_mss_cn_pc_rep_rp_st_d_f_test)。掃描時過濾條件包括:sales_flag、so_qty_mtd、channel_id、org_key、period_id,該表上原本的局部聚簇鍵PCK只包含了period_id,並沒有包括其餘三個過濾條件之一,因此,可以調整PCK,以減少掃描表a的執行時間。

補充:局部聚簇鍵

局部聚簇 (Partial Cluster Key, 簡稱PCK),列存儲下一種通過min/max稀疏索引實現基表快速掃描的索引技術。Partial Cluster Key可以指定多列,但是一般不建議超過2列。PCK適用於列存大表點查詢加速。

另外,查看語句中where條件中in值較多(12個),在DWS中,in後面的條件預設就只能是5個,超過6個就過濾不下推,此時,可以用or將12個值改寫,

A.PERIOD_ID IN (20220731,20221031,20220930,20220831,20221130)
or A.PERIOD_ID IN (20221231,20230131,20230228,20230430,20230331)
or A.PERIOD_ID IN (20230531,20230630)

image.png

此時,SQL語句執行時間減少為487ms,完整performance計劃如附件二所示。

點擊關註,第一時間瞭解華為雲新鮮技術~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Span 提供任意記憶體的連續區域的類型安全和記憶體安全表示形式。它是在堆棧而不是托管堆上分配的ref結構,是對任意記憶體塊的抽象 。 1.關於Span 在NET Core 2.1中首次引入 提供對任意記憶體上的連續區域的讀寫視圖 利用索引/迭代來修改範圍內的記憶體 幾乎無開銷 2.和記憶體的關係 Span 表 ...
  • Nexus 是支持 Nuget、Docker、Npm 等多種包的倉庫管理器,可用做私有包的存儲分發,緩存官方包。本篇將手把手教學使用 Nexus 搭建自己的 NuGe t& Docker 私有倉庫。 ...
  • 有的時候我們會對程式進行單元測試, 為了測試的效果以及後期的維護, 我一般會將各個測試拆開, 根據需要測試的類分到各個類型中, 不過在實際操作的時候就出現了一些意想不到的問題, 各個測試的執行是亂序的, 按照我自己寫測試的習慣, 假如我需要測試新寫的增刪改查的功能, 我會將增刪改查分開測試, 會按照 ...
  • 接上篇 docker-bind 的使用搭建了一個 dns 服務,本篇將介紹另外一款 DnsServer 的部署和使用,更專註,更輕量。 ...
  • MongoDB+SignalR+Hangfire+Vue2+百度地圖實現GPS實時定位 一、實現效果 二、安裝MongoDB 可以自行參考菜鳥鏈接:MongoDB 教程 | 菜鳥教程 (runoob.com) 1.下載mongodb資料庫安裝包: 網盤鏈接:https://pan.baidu.com ...
  • 目錄String簡單介紹常見命令應用場景Hash簡單介紹常見命令應用場景List簡單介紹常見命令應用場景Set簡單介紹常見命令應用場景Sorted Set(Zset)簡單介紹常見命令應用場景Bitmap簡單介紹常見命令應用場景附錄 Redis支持多種數據類型,比如String、hash、list、S ...
  • 在構建數據倉庫或做數據分析時,需要對原始數據的結構進行一定的處理,有時涉及到“行轉列”,有時涉及到“列轉行”,那麼這兩個轉換的方式具體是什麼,有什麼差異,怎麼實現。 ...
  • 本文主要以介紹方法為主,落地過程可以歸納為方案->收益測算->數據安全驗證->系統穩定性驗證->灰度與回滾。文中的賬單系統通過step1大表壓縮32%,step2大JSON欄位序列化12%,step3刪除無效數據10%,3個方案的順利落地,有效的減少了50.7%的磁碟空間,成本下降也非常顯著。最後,... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...