【數倉運維實踐】關於GaussDB(DWS)單SQL磁碟空間管控

来源:https://www.cnblogs.com/huaweiyun/archive/2023/03/23/17246849.html
-Advertisement-
Play Games

摘要:本文主要講解數倉運維中遇到單SQL磁碟空間管控問題的解析和方案。 本文分享自華為雲社區《GaussDB(DWS)運維 -- 單SQL磁碟空間管控》,作者: 譡里個檔。 【問題描述】 執行部分SQL語句時出現如下報錯信息(具體數值可能因為配置有差異),本文針對根因和場景觸發場景,確定觸發此類問題 ...


摘要:本文主要講解數倉運維中遇到單SQL磁碟空間管控問題的解析和方案。

本文分享自華為雲社區《GaussDB(DWS)運維 -- 單SQL磁碟空間管控》,作者: 譡里個檔。

【問題描述】

執行部分SQL語句時出現如下報錯信息(具體數值可能因為配置有差異),本文針對根因和場景觸發場景,確定觸發此類問題的根因

The space used on DN (209715224 kB) has exceeded the sql use space limit (209715200 kB)

【問題根因】

該報錯表示用戶執行的sql在單DN上所用空間超過了參數sql_use_spacelimit的限制。sql_use_spacelimit限制單個SQL在單個DN上,觸發落盤操作時,落盤文件的空間大小,管控的空間包括普通表、臨時表以及中間結果集落盤占用的空間

可以使用如下SQL查看所有實例上的配置參數sql_use_spacelimit的值

SELECT * FROM pgxc_settings WHERE name = 'sql_use_spacelimit';

【解決方案】

當前現網最常見的此類錯誤一般都是INERT語句觸發的,我們以常見如下語句為例,說明這類問題的解決方案

INSERT INTO dwljaa.bif_col_edw_dut_257_t
(attribute1, attribute2, attribute3, attribute4, attribute5, column_name1, column_name2, 
column_name3, column_name4, column_name5, tag_code, tag_id, table_name, period, tbl_code, 
tag_grp_code, target_key_val, cycle_id, creation_date, target_key_num, priority)
SELECT 
 'SCN_SVC_3003', NULL, NULL, NULL, NULL, 'BIZ_SCR_CODE', NULL, NULL, NULL, NULL,
 'SCN_SVC_3003-02', 3026937, 'dwr_fin_hwip_man_je_f_tmp0', '202208', 'PL_E17360237',
 'SUB_PL_PUB_SCN', A.record_seq_num, 20230321000000, SYSDATE, A.record_seq_num, 53333
FROM (SELECT /*+PARALLEL(8) NO_EXPAND*/ T.record_seq_num
 FROM dwljaa.dwr_fin_hwip_man_je_f_tmp0 T
 INNER JOIN dwrdim.dwr_dim_department_d PL_E100134 ON T.COA_DEPT_KEY = PL_E100134.DEPT_KEY
 INNER JOIN dwrdim.dwr_dim_grp_acct_code_d PL_E100119 ON T.GROUP_ACCOUNT_CODE = PL_E100119.GROUP_ACCOUNT_CODE
 INNER JOIN dwrdim.dwr_dim_journal_category_d PL_E100147 ON T.JE_CATEGORY_ID = PL_E100147.JE_CATEGORY_ID
 INNER JOIN dwrdim.dwr_dim_product_d PL_E100121 ON T.MAJOR_PROD_KEY = PL_E100121.PROD_KEY
 INNER JOIN dwrdim.dwr_dim_product_d PL_E100122 ON T.MINOR_PROD_KEY = PL_E100122.PROD_KEY
 INNER JOIN dwrdim.dwr_dim_project_d PL_E100155 ON T.PROJ_KEY = PL_E100155.PROJ_KEY
 WHERE 1 = 1 AND ((((((((((PL_E100119.LVL1_ACCOUNT_CODE IN('501', '503', '506', '512')) OR(PL_E100119.GROUP_ACCOUNT_CODE = '5980406')) AND((PL_E100121.PROD_CLASS_FLAG = '0') OR(PL_E100122.PROD_CLASS_FLAG = '0'))) OR((PL_E100119.LVL1_ACCOUNT_CODE IN('504', 'SVC')) OR(PL_E100119.LVL2_ACCOUNT_CODE IN('55107', '57702', '57703', '58303')) OR(PL_E100119.GROUP_ACCOUNT_CODE IN('5980407', '5825107', '5827702', '5827703', 'C501'))) OR((PL_E100119.ACCOUNT_EXPENSE_CATG_CODE IN('E01', 'E03', 'E05', 'E06', 'E08', 'E09', 'E10', 'E11', 'E02', 'E04', 'E07', 'E12')) AND(PL_E100134.DEPT_EXPENSE_TYPE_CODE = 'Z4') AND((PL_E100155.PROJ_TYPE_CODE <> '02') OR(PL_E100155.PROJ_NUM IN('9000000')))) OR((PL_E100119.ACCOUNT_EXPENSE_CATG_CODE IN('E02', 'E04', 'E07', 'E12', 'E05', 'E09', 'E10')) AND(PL_E100134.DEPT_EXPENSE_TYPE_CODE IN('Z1', 'Z2', 'Z3')) AND(PL_E100155.PROJ_TYPE_CODE = '01'))) AND((PL_E100119.GROUP_ACCOUNT_CODE <> 'EXP5555')))) AND(PL_E100119.LVL2_ACCOUNT_CODE <> '58303') AND(PL_E100155.PROJ_TYPE_CODE = '01'))) AND((PL_E100119.LVL1_ACCOUNT_CODE = '504') AND(PL_E100147.CN_NAME IN('JV-PFC cooper cost', 'JV-ADJ PA Cooper/Constr', 'JV-Agent REV&COST Adj', 'JV-Agent totalvalue Adj')))) OR((PL_E100119.ACCOUNT_EXPENSE_CATG_CODE = 'E05') AND(PL_E100134.DEPT_EXPENSE_TYPE_CODE IN('Z1', 'Z2', 'Z3')) AND(PL_E100155.PROJ_TYPE_CODE = '01') AND(PL_E100147.CN_NAME <> 'JV-ADJ 557 WITH B CODE') AND((((((((PL_E100119.LVL1_ACCOUNT_CODE IN('501', '503', '506', '512')) OR(PL_E100119.GROUP_ACCOUNT_CODE = '5980406')) AND((PL_E100121.PROD_CLASS_FLAG = '0') OR(PL_E100122.PROD_CLASS_FLAG = '0'))) OR((PL_E100119.LVL1_ACCOUNT_CODE IN('504', 'SVC')) OR(PL_E100119.LVL2_ACCOUNT_CODE IN('55107', '57702', '57703', '58303')) OR(PL_E100119.GROUP_ACCOUNT_CODE IN('5980407', '5825107', '5827702', '5827703', 'C501'))) OR((PL_E100119.ACCOUNT_EXPENSE_CATG_CODE IN('E01', 'E03', 'E05', 'E06', 'E08', 'E09', 'E10', 'E11', 'E02', 'E04', 'E07', 'E12')) AND(PL_E100134.DEPT_EXPENSE_TYPE_CODE = 'Z4') AND((PL_E100155.PROJ_TYPE_CODE <> '02') OR(PL_E100155.PROJ_NUM IN('9000000')))) OR((PL_E100119.ACCOUNT_EXPENSE_CATG_CODE IN('E02', 'E04', 'E07', 'E12', 'E05', 'E09', 'E10')) AND(PL_E100134.DEPT_EXPENSE_TYPE_CODE IN('Z1', 'Z2', 'Z3')) AND(PL_E100155.PROJ_TYPE_CODE = '01'))) AND((PL_E100119.GROUP_ACCOUNT_CODE <> 'EXP5555')))) AND(PL_E100119.LVL2_ACCOUNT_CODE <> '58303') AND(PL_E100155.PROJ_TYPE_CODE = '01')))))
 AND T.PERIOD_ID >= 202208
 AND T.PERIOD_ID <= 202208 
) A

場景1

1)往目標表INSERT的數據量過大,導致INSERT的數據量在單DN上使用的存儲空間超過sql_use_spacelimit閾值

這種場景一般是配置參數sql_use_spacelimit設置不合理,建議直接調大配置參數sql_use_spacelimit的值

2)INSERT的數據存在傾斜,導致某個DN上數據寫入量特別大,在這個DN上觸發了sql_use_spacelimit閾值

這類問題的解決一般分為以下幾個步驟

a)使用如下SQL查找目標表分佈列

SELECT pg_get_tabledef('dwljaa.bif_col_edw_dut_257_t'::regclass);

獲取的表定義如下

SET search_path = dwljaa;
CREATE TABLE bif_col_edw_dut_257_t (
tag_grp_code character varying(100),
tag_code character varying(100),
tag_id numeric,
period character varying(20),
tbl_code character varying(100) NOT NULL,
table_name character varying(50),
target_key_val character varying(100),
target_key_num numeric,
cycle_id numeric,
creation_date timestamp(0) without time zone,
attribute1 character varying(100),
attribute2 character varying(100),
attribute3 character varying(100),
attribute4 character varying(100),
attribute5 character varying(100),
priority numeric,
column_name1 character varying(100),
column_name2 character varying(100),
column_name3 character varying(100),
column_name4 character varying(100),
column_name5 character varying(100),
carrying_dimension1 character varying(100),
carrying_dimension2 character varying(100),
carrying_dimension3 character varying(100)
)
WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false)
DISTRIBUTE BY HASH(target_key_num)
TO GROUP group_version1;

b)根據表定義和INSERT語句,確認分佈列在查詢語句中的輸出列位置

根據表定義(分佈列為target_key_num)以及原始的INSERT語句描述,查詢語句輸出的導數第二列( A.record_seq_num)對應目標表的分佈列target_key_num

c)構建如下查詢語句,判斷查詢語句輸出數據在欄位A.record_seq_num是否存在嚴重

如果輸出的第一條記錄的cnt值非常大(比如上百萬甚至更多),導致此值對應記錄的存儲空間可能觸發sql_use_spacelimit閾值,那麼就可以明確是數據傾斜導致的。 這種場景一般需要先排查數據傾斜產生的原因是否合理,如果數據缺失存在傾斜,那麼建議修改表的分佈列,具體修改方案參見GaussDB(DWS)性能調優系列實戰篇三:十八般武藝之好味道表定義》

WITH t AS(-- 把原始語句中的查詢部分封裝為CTE,查詢語句實處列只包含分佈列
 SELECT 
 A.record_seq_num
 FROM (SELECT /*+PARALLEL(8) NO_EXPAND*/ T.record_seq_num
 FROM dwljaa.dwr_fin_hwip_man_je_f_tmp0 T
 INNER JOIN dwrdim.dwr_dim_department_d PL_E100134 ON T.COA_DEPT_KEY = PL_E100134.DEPT_KEY
 INNER JOIN dwrdim.dwr_dim_grp_acct_code_d PL_E100119 ON T.GROUP_ACCOUNT_CODE = PL_E100119.GROUP_ACCOUNT_CODE
 INNER JOIN dwrdim.dwr_dim_journal_category_d PL_E100147 ON T.JE_CATEGORY_ID = PL_E100147.JE_CATEGORY_ID
 INNER JOIN dwrdim.dwr_dim_product_d PL_E100121 ON T.MAJOR_PROD_KEY = PL_E100121.PROD_KEY
 INNER JOIN dwrdim.dwr_dim_product_d PL_E100122 ON T.MINOR_PROD_KEY = PL_E100122.PROD_KEY
 INNER JOIN dwrdim.dwr_dim_project_d PL_E100155 ON T.PROJ_KEY = PL_E100155.PROJ_KEY
 WHERE 1 = 1 AND ((((((((((PL_E100119.LVL1_ACCOUNT_CODE IN('501', '503', '506', '512')) OR(PL_E100119.GROUP_ACCOUNT_CODE = '5980406')) AND((PL_E100121.PROD_CLASS_FLAG = '0') OR(PL_E100122.PROD_CLASS_FLAG = '0'))) OR((PL_E100119.LVL1_ACCOUNT_CODE IN('504', 'SVC')) OR(PL_E100119.LVL2_ACCOUNT_CODE IN('55107', '57702', '57703', '58303')) OR(PL_E100119.GROUP_ACCOUNT_CODE IN('5980407', '5825107', '5827702', '5827703', 'C501'))) OR((PL_E100119.ACCOUNT_EXPENSE_CATG_CODE IN('E01', 'E03', 'E05', 'E06', 'E08', 'E09', 'E10', 'E11', 'E02', 'E04', 'E07', 'E12')) AND(PL_E100134.DEPT_EXPENSE_TYPE_CODE = 'Z4') AND((PL_E100155.PROJ_TYPE_CODE <> '02') OR(PL_E100155.PROJ_NUM IN('9000000')))) OR((PL_E100119.ACCOUNT_EXPENSE_CATG_CODE IN('E02', 'E04', 'E07', 'E12', 'E05', 'E09', 'E10')) AND(PL_E100134.DEPT_EXPENSE_TYPE_CODE IN('Z1', 'Z2', 'Z3')) AND(PL_E100155.PROJ_TYPE_CODE = '01'))) AND((PL_E100119.GROUP_ACCOUNT_CODE <> 'EXP5555')))) AND(PL_E100119.LVL2_ACCOUNT_CODE <> '58303') AND(PL_E100155.PROJ_TYPE_CODE = '01'))) AND((PL_E100119.LVL1_ACCOUNT_CODE = '504') AND(PL_E100147.CN_NAME IN('JV-PFC cooper cost', 'JV-ADJ PA Cooper/Constr', 'JV-Agent REV&COST Adj', 'JV-Agent totalvalue Adj')))) OR((PL_E100119.ACCOUNT_EXPENSE_CATG_CODE = 'E05') AND(PL_E100134.DEPT_EXPENSE_TYPE_CODE IN('Z1', 'Z2', 'Z3')) AND(PL_E100155.PROJ_TYPE_CODE = '01') AND(PL_E100147.CN_NAME <> 'JV-ADJ 557 WITH B CODE') AND((((((((PL_E100119.LVL1_ACCOUNT_CODE IN('501', '503', '506', '512')) OR(PL_E100119.GROUP_ACCOUNT_CODE = '5980406')) AND((PL_E100121.PROD_CLASS_FLAG = '0') OR(PL_E100122.PROD_CLASS_FLAG = '0'))) OR((PL_E100119.LVL1_ACCOUNT_CODE IN('504', 'SVC')) OR(PL_E100119.LVL2_ACCOUNT_CODE IN('55107', '57702', '57703', '58303')) OR(PL_E100119.GROUP_ACCOUNT_CODE IN('5980407', '5825107', '5827702', '5827703', 'C501'))) OR((PL_E100119.ACCOUNT_EXPENSE_CATG_CODE IN('E01', 'E03', 'E05', 'E06', 'E08', 'E09', 'E10', 'E11', 'E02', 'E04', 'E07', 'E12')) AND(PL_E100134.DEPT_EXPENSE_TYPE_CODE = 'Z4') AND((PL_E100155.PROJ_TYPE_CODE <> '02') OR(PL_E100155.PROJ_NUM IN('9000000')))) OR((PL_E100119.ACCOUNT_EXPENSE_CATG_CODE IN('E02', 'E04', 'E07', 'E12', 'E05', 'E09', 'E10')) AND(PL_E100134.DEPT_EXPENSE_TYPE_CODE IN('Z1', 'Z2', 'Z3')) AND(PL_E100155.PROJ_TYPE_CODE = '01'))) AND((PL_E100119.GROUP_ACCOUNT_CODE <> 'EXP5555')))) AND(PL_E100119.LVL2_ACCOUNT_CODE <> '58303') AND(PL_E100155.PROJ_TYPE_CODE = '01')))))
 AND T.PERIOD_ID >= 202208
 AND T.PERIOD_ID <= 202208 
    ) A
)
-- 對分佈列做彙總求和,查找分佈列值重覆次數最多的值
SELECT 
 record_seq_num, cnt
FROM (
 SELECT record_seq_num, count(1) AS cnt 
 FROM t 
 GROUP BY record_seq_num HAVING count(1) > 10000
)
ORDER BY cnt
LIMIT 10

 

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


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

-Advertisement-
Play Games
更多相關文章
  • 當前的Winform分頁控制項中,當前導出的數據一般使用Excel來處理,Excel的文檔可以用於後期的數據展示或者批量導入做準備,因此是比較好的輸入輸出格式。但是有框架的使用客戶希望分頁控制項能夠直接導出PDF,雖然Excel也可以直接轉換為PDF,不過直接導出PDF的處理肯定更加方便直觀。因此整理了... ...
  • 1. 核心關註點 1.1. 開發軟體的原因 2. 切麵關註點 2.1. 所有的代碼領域都需要處理相關的問題 3. 結構化模式 3.1. 裝飾器模式 3.1.1. 可以在現有對象上添加新的功能,而不改變其結構 3.2. 代理模式 3.2.1. 所提供的對象可以替代客戶端使用的實際服務對象 4. 使用P ...
  • 使用lvs+keepalived架構架構實現後端web伺服器(該web伺服器要求搭建wordpress博客站)的負載均衡 最終客戶端訪問功能變數名稱 我的名字.wordpress.cn 能夠訪問搭建的博客站 ,達到負載均衡的目的 IP 主機名 角色 192.168.26.101 rs1 後端真實伺服器/ng ...
  • 操作系統: RHEL7.x 或CentOS 7.x 最小化安裝 配置好固定的IP,能訪問互聯網 配置好yum源(yum repolist 可以查看yum源) 本地光碟 掛載光碟,開機自動掛載 vim + /etc/fstable /dev/sr0 /mnt iso9660 defaults 0 0 ...
  • 一:存儲架構 根據存儲設備所在的位置分類 1、DAS DAS:(Direct-Attached Storage)直連式存儲。伺服器使用專用線纜(例如SCSI)和存儲設備(例如磁碟陣列)進行直連。 特點: 優點是儲設備只能連接到一臺主機使用,無法共用,成本較高,且安全性可靠性較低 缺點是容量有限,不適 ...
  • 一、線程簡介 線程是參與系統調度的最小單位。它被包含在進程之中,是進程中的實際運行單位。 一個進程中可以創建多個線程,多個線程實現併發運行,每個線程執行不同的任務。 每個線程都有其對應的標識,稱為線程 ID,線程 ID 使用 pthread_t 數據類型來表示。 二、線程的創建 線程是輕量級的併發執 ...
  • MySQL基礎:事務 事務簡介 事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。 預設MySQL的事務是自動提交的,也就是說,當執行一條DML(數據操作語言:對資料庫進行增刪改操作)語句,MySQL會 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: 蟹黃瓜子 文章來源:GreatSQL社區投稿 Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可抑制的容器中,然 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...