2個數倉中不等值關聯優化案例

来源:https://www.cnblogs.com/huaweiyun/archive/2023/10/19/17774728.html
-Advertisement-
Play Games

本文分享自華為雲社區《GaussDB(DWS)性能調優:不等值關聯優化》,作者: 門前一棵葡萄樹。 場景1 使用場景:本案例適合滿足以下條件的場景 關聯條件使用OR連接 關聯條件中使用同一列做數據篩選 原始語句 SELECT t2.PARTNER_CHANNEL_CODE AS CHANNEL_ID ...


本文分享自華為雲社區《GaussDB(DWS)性能調優:不等值關聯優化》,作者: 門前一棵葡萄樹。

場景1

使用場景:本案例適合滿足以下條件的場景

  1. 關聯條件使用OR連接
  2. 關聯條件中使用同一列做數據篩選

原始語句

SELECT

t2.PARTNER_CHANNEL_CODE AS CHANNEL_ID

,t1.COUNTRY_CODE

,t1.BRAND

,t2.CHANNEL_ID AS CHANNEL_ID2

FROM

t1

LEFT JOIN

t2

ON

( t2.CHANNEL_ID = t1.CHANNEL_ID AND t1.TYPE = 'DR' )

OR ( t2.PARTNER_CHANNEL_CODE = t1.CHANNEL_ID AND t1.TYPE = 'ALL' )

GROUP BY

t2.PARTNER_CHANNEL_CODE

,t1.COUNTRY_CODE

,t1.BRAND

,t2.CHANNEL_ID

性能分析

通過查詢計劃分析發現,t1表和t2表關聯走了NEST LOOP,查詢整體耗時45S,NEST LOOP耗時占用整個查詢執行耗時的96%。因此考慮能否通過SQL改寫或HINT規避NEST LOOP。觀察發現t1表和t2表包含兩個關聯關聯條件,兩個關聯條件之間使用OR連接,屬於非等值關聯,因此不能走HASH JOIN。進一步分析SQL發現兩個關聯條件中都使用t1.TYPE進行過濾篩選:

(t2.CHANNEL_ID = t1.CHANNEL_ID AND t1.TYPE='DR')

OR (t2.PARTNER_CHANNEL_CODE = t1.CHANNEL_ID AND t1.TYPE='ALL' )

該關聯條件包含以下三種關聯組合:

  1. t1表中t1.TYPE='DR'的行,只能使用第一個關聯條件與t2表關聯;
  2. t1表中t1.TYPE='ALL'的行,只能使用第二個關聯條件與t2表關聯;
  3. t1表中t1.TYPE NOT IN ('ALL','DR')的行,不與t2表關聯,直接補空。

t1表中的一行數據只能選擇這三個關聯條件中的一個與t2表關聯,因此該關聯條件可以改寫為不同關聯條件的UNION ALL(UNION會去重,不等價)。

優化改寫

改寫後SQL如下所示:

SELECT

CHANNEL_ID

,COUNTRY_CODE

,BRAND

,CHANNEL_ID

FROM

(

SELECT

t2.PARTNER_CHANNEL_CODE AS CHANNEL_ID

,t1.COUNTRY_CODE

,t1.BRAND

,t2.CHANNEL_ID AS CHANNEL_ID2

FROM

t1

LEFT JOIN

t2

ON

t2.CHANNEL_ID = t1.CHANNEL_ID

WHERE

t1.TYPE = 'DR'

UNION ALL

SELECT

t2.PARTNER_CHANNEL_CODE AS CHANNEL_ID

,t1.COUNTRY_CODE

,t1.BRAND

,t2.CHANNEL_ID AS CHANNEL_ID2

FROM

t1

t2

ON t2.PARTNER_CHANNEL_CODE = t1.CHANNEL_ID

WHERE t1.TYPE='ALL'

UNION ALL

SELECT

t2.PARTNER_CHANNEL_CODE AS CHANNEL_ID

,t1.COUNTRY_CODE

,t1.BRAND

,t2.CHANNEL_ID AS CHANNEL_ID2

FROM t1

LEFT JOIN

t2

ON FALSE

WHERE t1.TYPE NOT IN ('ALL','DR')

)

GROUP BY CHANNEL_ID,COUNTRY_CODE,BRAND,CHANNEL_ID

改寫後SQL變為三個子查詢的UNION ALL,執行時間縮減至1s以內,性能優化45倍。

場景二

使用場景:本案例適合滿足以下條件的場景

  1. 大表A不等值關聯小表B
  2. B的等值關聯欄位為主鍵

【原始語句】

SELECT

T.CREATE_INVOICE_USER,

T.PERIOD_ID,

T.AP_INVOICE_ID,

T.AP_INVOICE_NUM,

T.AP_BATCH_NAME,

EMP1.EMPLOYEE_NO,

EMP1.EMPLOYEE_NAME

FROM DWACTDI.DWR_AP_GLOBAL_INVOICE_DETAIL_F_I T

LEFT JOIN DWRDIM_DW1.DWR_DIM_EMPLOYEE_D EMP1 ON (EMP1.SCD_ACTIVE_IND = 1 AND(T.CREATE_INVOICE_USER = EMP1.EMPLOYEE_NO OR SUBSTR(T.CREATE_INVOICE_USER, 2) = EMP1.EMPLOYEE_NO))

【性能分析】

原始語句執行超時(超過1h),執行計劃如下。可以看到執行語句存在大表NestLoop操作

cke_114.png

分析發現表dwrdim_dw1.dwr_dim_employee_d是維度表,且關聯列employee_no是主鍵

【優化改寫】

SELECT

T.CREATE_INVOICE_USER,

T.PERIOD_ID,

T.AP_INVOICE_ID,

T.AP_INVOICE_NUM,

T.AP_BATCH_NAME,

nvl(EMP1_0.EMPLOYEE_NO, EMP1_1.EMPLOYEE_NO) AS EMPLOYEE_NO,

nvl(EMP1_0.EMPLOYEE_NAME, EMP1_1.EMPLOYEE_NAME) AS ERP_ACCOUNTANT_ENAME

FROM DWACTDI.DWR_AP_GLOBAL_INVOICE_DETAIL_F_I T

LEFT JOIN DWRDIM_DW1.DWR_DIM_EMPLOYEE_D EMP1_0 ON (EMP1_0.SCD_ACTIVE_IND = 1 AND(T.CREATE_INVOICE_USER = EMP1_0.EMPLOYEE_NO))

LEFT JOIN DWRDIM_DW1.DWR_DIM_EMPLOYEE_D EMP1_1 ON (EMP1_1.SCD_ACTIVE_IND = 1 AND(SUBSTR(T.CREATE_INVOICE_USER, 2) = EMP1_1.EMPLOYEE_NO))

改寫後執行信息如下

cke_115.png

 

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

 


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

-Advertisement-
Play Games
更多相關文章
  • 【學習課程】:【【小白入門 通俗易懂】2021韓順平 一周學會Linux】 https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e054 ...
  • 前言 該方案實現的效果就是通過指定用戶名可以直接ssh連接到某個linux機器中的chroot開發環境,在 ubuntu 22.04 環境測試通過 流程 首先我們需要有個現成的 chroot 環境,我這裡是 debian10-aarch64 文件夾,如果你沒有可以參考我先前的文章製作一個: http ...
  • 前言 我的主力環境是 Windows 系統,但是同樣需要維護一些 linux 工程代碼。一般情況下,只需要開個 vmware 虛擬機,裝個 linux 系統就可以進行修改,編譯和調試操作,但是有時候我卻需要對 linux 真機環境進行遠程調試,這時候如果能直接在 windows 系統載入 linux ...
  • AutoSSH 是一種用以對 SSH 登錄進行安全地自動化的軟體。! 比如我們在 host2 機器上面部署了很多服務,但是由於某種原因導致我們無法直接 ssh 訪問該伺服器已經其上服務的對應埠,但是 host3 伺服器,既能夠訪問 host2 伺服器,又可以訪問我們的 host1 伺服器。這是,我 ...
  • 哈嘍大家好,我是鹹魚 不知道大家在日常學習或者工作當中用 dig 命令多不多 dig 是 Domain Information Groper 的縮寫,對於網路管理員和在功能變數名稱系統(DNS)領域工作的小伙伴來說,它是一個非常常見且有用的工具。 無論是簡單的 DNS 解析查找還是更高級的故障排除和分析,d ...
  • 為了提高 Web 應用程式和數據驅動服務的性能與效率,使用 Redis 或 Amazon ElastiCache 來作為緩存加速已經是業界主流的解決方案。隨著業務規模的增長,其需要處理的數據越來越多,使用有效的緩存機制更是尤為重要,如何選擇適合的緩存解決方案呢? ...
  • 上傳hadoop-3.3.4.tar.gz到/export/server 解壓 tar -zxvf hadoop-3.3.4.tar.gz -C /export/server/ # 快捷方式 ln -s /export/server/hadoop-3.3.4 hadoop Hadoop安裝包目錄結構 ...
  • 寫分頁查詢介面,order by和limit混用的時候,出現了排序的混亂情況 在進行第N頁查詢時,出現與第一前面頁碼的數據一樣的記錄。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...