GaussDB(DWS)性能调优解决DM区内存占用大的问题
【场景一】f.period_id = 维度表.period_id
1.1、【问题描述】
主表与维度表关联过程中,使用核算周期作为关联条件,导致维度表未进行分区和剪枝,可能会导致内存占用较大。
1.2、【原始SQL】
仅出现SQL 中的问题。详细SQL请参见附件。
FROMDMACC.dm_adp_ar_trx_dtl_tmp FINNER JOIN DMDIM.DM_DIM_REGION_RC_D REG ON F.COA_GEO_PC_KEY=REG.GEO_PC_KEYINNER JOIN DMDIM.DM_DIM_PRODUCT_T_D T9 ON F.PROD_KEY=T9.PROD_KEY AND T9.PROD_POV_ID=1 INNER JOIN D MDIM.DM_DIM_PROJECT_D J ON F.PROJ_KEY=J.PROJ_KEYINNER将DMDIM.DM_DIM_CONTRACT_D HT 连接到HT.CONTRACT_KEY=F.CONTRACT_KEYLEFT 连接DMCOMMON.DWR_CONFIG_DOMESTIC_FINANCE_V FIN 连接到F.COA_COMPANY_KEY 和F.COA_GEO_PC_KEY=FIN.GEO_PC_KEYLEFT 连接DMAR.DWB_FMD_DI M_INVOICE_PAY_PLAN _D PP ON F.AR_INVOICE_PAY_PLAN_ID=PP.AR_INVOICE_PAY_PLAN_ID 和F.PERIOD_ID=PP .PERIOD_IDLEFT JOIN DMARDI.DWR_DIM_AR_INVOICE_V INV ON F.AR_INVOICE_ID=INV.AR_INVOICE_IDINNER JOIN DMARDI.DWR_DIM_AR_APPLICATION_V 应用程序ON F.AR_APPLICATION_RECORD_IDINNER JOIN DMARDI.DWR_DIM_AR _RECEIPT_VRCP ON F.AR_ RECEIPT_RECORD_ID=RCP.AR_RECEIPT_RECORD_IDINNER JOIN DMARDI.DWR_DIM_AR_RECEIPT_TYPE_V RT ON RCP .RECEIPT_RECORD_TYPE_ID=RT。 AR_RECEIPT_TYPE_IDLEFT JOIN(从DMDIM.dm_dim_contract_d C、DMARDI.DWR_CTRCT_FIRST_SHIP_DATE_R 选择C.CONTRACT_KEY、D.COMPANY_KEY、R.FIRST_SHIP_DATE,其中EC.CONTRACT_ID=R.CONTRACT_ID AND D.COMPANY_ID=R.COMPANY_ID ) FR ON F.CONTRACT _KEY=FR.CONTRACT_KEY AND F.COA_COMPANY_KEY=FR.COMPANY_KEYINNER JOIN DMDIM.DM_DIM_SALES_MODE_D MO ON F.SALES_MODE_KEY=MO.SALES_MODE_KEYJOIN DMDIM.DM_DIM_JOURNAL_SOURCE_D T29 ON F.JE_SOURCE_ID=T29.JE_SOURCE_IDJOIN DMDIM.DM_DIM_JOURN AL_CATEGORY_D T30 ON F.JE_CATEGORY_ID=T30.JE_CATEGORY_ID
1.3、【性能分析】
可以从上图中的执行计划可以看出,由于采用会计期间作为关联条件,维表没有进行分区和剪枝,数据量较大。不仅会出现数据倾斜,还会由于大量数据出现关联下载,大大降低SQL执行性能。
主表只有一个会计期间。可以识别对应的会计期间,然后重写SQL如下:
FROMDMACC.dm_adp_ar_trx_dtl_tmp FINNER JOIN DMDIM.DM_DIM_REGION_RC_D REG ON F.COA_GEO_PC_KEY=REG.GEO_PC_KEYINNER JOIN DMDIM.DM_DIM_PRODUCT_T_D T9 ON F.PROD_KEY=T9.PROD_KEY AND T9.PROD_POV_ID=1 INNER JOIN D MDIM.DM_DIM_PROJECT_D J ON F.PROJ_KEY=J.PROJ_KEYINNER将DMDIM.DM_DIM_CONTRACT_D HT 连接到HT.CONTRACT_KEY=F.CONTRACT_KEYLEFT 连接DMCOMMON.DWR_CONFIG_DOMESTIC_FINANCE_V FIN 连接到F.COA_COMPANY_KEY 和F.COA_GEO_PC_KEY=FIN.GEO_PC_KEYLEFT 连接DMAR.DWB_FMD_DI M_INVOICE_PAY_PLAN _D PP ON F.AR_INVOICE_PAY_PLAN_ID=PP.AR_INVOICE_PAY_PLAN_ID 和PP.PERIOD_ID=’ 202406’左加入DMARDI.DWR_DIM_AR_INVOICE_V INV ON F.AR_INVOICE_ID=INV.AR_INVOICE_IDINNER JOIN DMARDI.DWR_DIM_AR_APPLICATION_V 应用程序ON F.AR_APPLICATION_RECORD_IDINNER JOIN DMARDI.DWR_DIM_AR _RECEIPT_VRCP ON F.AR _RECEIPT_RECORD_ID=RCP.AR_RECEIPT_RECORD_IDINNER JOIN DMARDI.DWR_DIM_AR_RECEIPT_TYPE_V RT ON RCP.RECEIPT_RECORD_TYPE_ID=RT .AR_RECEIPT_TYPE_IDLEFT JOIN(从DMDIM.dm_dim_contract_d C、DMARDI.DWR_CTRCT_FIRST_SHIP_DATE_R R W HEREC.CONTRACT_ID=R.CONTRACT_ID AND D.COMPANY_ID=R.COMPANY_ID 选择C.CONTRACT_KEY、D.COMPANY_KEY、R.FIRST_SHIP_DATE ) FR ON F. CONTRACT_KEY=FR。 CONTRACT_KEY 和F.COA_COMPANY_KEY=FR.COMPANY_KEYINNER JOIN DMDIM.DM_DIM_SALES_MODE_D MO ON F.SALES_MODE_KEY=MO.SALES_MODE_KEYJOIN DMDIM.DM_DIM_JOURNAL_SOURCE_D T29 ON F.JE_SOURCE_ ID=T29.JE_SOURCE_IDJOIN DMDIM.DM_DI M_JOURNAL_CATEGORY_D T30 ON F. JE_CATEGORY_ID=T30.JE_CATEGORY_ID 优化后,执行计划如下图所示。对维度表进行分区和剪枝,减少数据量,缓解数据倾斜,避免关联底盘问题。
【场景二】f left join 维度表 on f.period_id = 维度表.period_id and 维度表.period_id = ‘会计期’
2.1、【问题描述】
主表和维度表关联过程中,使用了核算期间作为关联条件,同时也指定了维度表的核算期间,可能会导致数据倾斜无法识别。
2.2、【原始SQL】
FROMdmdp.dm_dpc_inv_m_dtl_f_TEM_A LT1LEFT JOIN dmcommon.dm_dim_prod_key_r LT2 ON LT1.prod_key=LT2.old_key AND LT1.period_id=LT2.period_id AND LT2.PERIOD_ID=202406LE FT将dmcommon.dm_dim_reg_key_r LT3 加入LT1.period_id=LT3.period_id AND LT1 。 geo_pc_key=LT3.old_key AND LT3.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_cus_key_r LT4 ON LT1.period_id=LT4.period_id AND LT1.account_dept_cust_key=LT4.old_key AND LT4.PERIOD_ID=202406LEFT JOIN dm common。 dm_dim_proj_key_r LT5 ON LT1.period_id=LT5 。 period_id AND LT1.proj_key=LT5.old_key AND LT5.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_cus_key_r LT6 ON LT1.period_id=LT6.period_id AND LT1.enterprise_cust_key=LT6.old_key AND LT6.PERIOD_ID=202406LEFT JO IN dmcommon.dm_dim_rep_key_r LT7 ON LT1 。 period_id=LT7.period_id AND LT1.report_item_id=LT7.old_key AND LT7.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_supply_center_key_r LT8 ON LT1.period_id=LT8.period_id AND LT1.supply_center_key=LT8.old_key AND LT8.PERIO D_ ID=202406LEFT JOIN dmcommon。 dm_dim_inv_key_r LT9 ON LT1.period_id=LT9.period_id AND LT1.inventory_class_key=LT9.old_key AND LT9.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_bus_key_r LT10 ON LT1.period_id=LT10.period_id AND LT1.business_status_key=LT10.old_ key 和LT10.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_hisi_key_r LT11 ON LT1.period_id=LT11.period_id AND LT1.hisi_prod_key=LT11.old_key AND LT11.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_inv_org_key_r LT12 ON LT1.period_id=LT12.period_id AND LT1.inventory_org_key=LT12.old_key AND LT12 .PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_cus_key_r LT13 ON LT1.period_id=LT13.period_id AND LT1.end_cust_key=LT13.old_key AND LT13.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_cus_key_ r LT 14 ON LT1.period_id=LT14.period_id AND LT1。 sign_cust_key=LT14 .old_key AND LT14.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_cus_key_r LT15 ON LT1.period_id=LT15.period_id AND LT1.agent_distribution_cust_key=LT15.old_key AND LT15.PERIOD_ID=202406LEFT在LT1.period_id=LT16 上加入dmcommon .dm_dim_com_key_r LT16。 period_id AND LT1 .company_key=LT16.old_key AND LT16.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_con_key_r LT17 ON LT1.period_id=LT17.period_id AND LT1.contract_key=LT17.old_key AND LT17.PERIOD_ID=202406LEFT J OIN d mcommon.dm_dim_con_key_r LT18 ON LT1 .period_id=LT18 .period_id AND LT1.loan_contract_key=LT18.old_key AND LT18.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_supply_center_key_r LT19 ON LT1.period_id=LT19.period_id AND LT1.target_supply_center_key=LT19。 old_key AND LT19.PER IOD_ID=202406LEFT JOIN dmcommon .dm_dim_subinventory_key_r LT20 ON LT1 .period_id=LT20.period_id AND LT1.subinventory_key=LT20.old_key AND LT20.PERIOD_ID=202406 WHERE1=1 AND partition_value IN (0, 1)
2.3、【性能分析】
从上面的执行计划可以看出图中,关联过程从主表开始,数据库中存在数据倾斜,导致SQL执行性能不佳。
在详细执行计划中,虽然对维表进行了分区和剪枝,但由于使用了left join,导致关联条件中维表的常量period_id无法直接赋值给主表period_id。主表关联结果重新分配时,将period_id作为分配键之一,影响优化器的倾斜优化。
可以删除关联条件f.period_id=维度表.period_id,重写sql如下
FROMdmdp.dm_dpc_inv_m_dtl_f_TEM_A LT1LEFT JOIN dmcommon.dm_dim_prod_key_r LT2 ON LT1.prod_key=LT2.old_key AND LT2.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_reg_key_r LT3 ON pc_key=LT3.old_key AND LT3.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_cus_key_r LT4 ON LT1 。 account_dept_cust_key=LT4.old_key AND LT4.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_proj_key_r LT5 ON LT1.proj_key=LT5.old_key AND LT5.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_cus_key_r LT6 ON LT1.enterprise_cust_key=LT6.old_key AND LT6.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_rep_key_r LT7 ON LT1.report_item_id=LT7.old_key AND LT7.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_supply_center_key_r LT8 ON LT1.supply_center_key=LT8.old_key AND LT8.PERIOD_ID=2 02406 左连接dmcommon.dm_dim_inv_key_r LT9 ON LT1.inventory_class_key=LT9。 old_key 和LT9.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_bus_key_r LT10 ON LT1.business_status_key=LT10.old_key 和LT10.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_hisi_key_r LT11 ON LT1.hisi_prod _key=LT11.old_key AND LT11.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_inv_org_key_r LT12 ON LT1.inventory_org_key=LT12.old_key AND LT12.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_cus_key_r LT13 ON LT1.end_cust_key=LT13.old_key AND LT13.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_cus_ key_r LT14 ON LT1.sign_cust_key=LT14.old_key AND LT14。 PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_cus_key_r LT15 ON LT1.agent_distribution_cust_key=LT15.old_key AND LT15.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_com_key_r LT16 ON LT1.company_key=LT16 .old_key AND LT16.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dm_con_key_r LT17 ON LT1.contract_key=LT17 .old_key AND LT17.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_con_key_r LT18 ON LT1.loan_contract_key=LT18.old_key AND LT18.PERIOD_ID=202406LEFT JOIN dmcommon.dm_dim_supply_center_key_r LT 19 ON LT1 .target_supply_center_key=LT19.old_key AND LT19.PERIOD_ID=202406LEFT JOIN dmcommon .dm_dim_subinventory_key_r LT20 ON LT1.subinventory_key=LT20.old_key AND LT20.PERIOD_ID=202406 WHERE1=1 AND partition_value IN (0, 1) 重写后执行计划如下
用户评论
断桥残雪
看了这篇文章,感觉GaussDB(DWS)的性能调优真的挺重要的,之前一直头疼DM区内存占用大,这些建议用起来应该能解决问题。
有10位网友表示赞同!
如梦初醒
这篇文章太实用了,我正为DM区内存占用大头疼,这些调优方法我一定要试试。
有5位网友表示赞同!
小清晰的声音
DM区内存占用大确实影响数据库性能,这篇文章的解决方法很到位,感谢分享。
有13位网友表示赞同!
站上冰箱当高冷
这篇文章让我对GaussDB(DWS)的性能调优有了更深入的了解,尤其是针对DM区的内存优化。
有12位网友表示赞同!
命该如此
终于找到解决DM区内存占用大的方法了,这篇文章真的帮了大忙。
有5位网友表示赞同!
坏小子不坏
这篇文章提到的性能调优方法,对其他数据库应该也适用,太有用了。
有11位网友表示赞同!
雪花ミ飞舞
DM区内存占用大真的很头疼,这篇文章的调优建议让我看到了希望。
有13位网友表示赞同!
孤廖
GaussDB(DWS)的性能调优确实关键,这篇文章的方法挺全面的,感谢分享。
有14位网友表示赞同!
你身上有刺,别扎我
之前一直在找解决DM区内存占用大的办法,这篇文章的调优技巧很实用。
有6位网友表示赞同!
反正是我
这篇文章让我对DM区内存优化有了全新的认识,之前的方法都不够系统。
有11位网友表示赞同!
麝香味
DM区内存占用大,影响了业务效率,这篇文章提供的调优方案很实用。
有14位网友表示赞同!
孤败
性能调优是一门学问,这篇文章对GaussDB(DWS)的DM区内存优化分析得非常透彻。
有16位网友表示赞同!
珠穆郎马疯@
之前对DM区内存优化不太懂,这篇文章让我有了明确的方向。
有16位网友表示赞同!
莫阑珊
这篇文章的GaussDB(DWS)性能调优技巧,让我对数据库有了更深的认识。
有12位网友表示赞同!
嘲笑!
DM区内存占用大问题,我尝试了各种方法,这篇文章的方法让我眼前一亮。
有6位网友表示赞同!
海盟山誓总是赊
性能调优是数据库维护的重要环节,这篇文章的建议很有价值。
有20位网友表示赞同!
容纳我ii
这篇文章让我对GaussDB(DWS)的DM区内存优化有了新的认识,之前的优化方法太简单了。
有14位网友表示赞同!
╭摇划花蜜的午后
DM区内存占用大,这篇文章的调优方案让我看到了解决问题的希望。
有16位网友表示赞同!
聽風
性能调优是提高数据库性能的关键,这篇文章的建议很有指导意义。
有16位网友表示赞同!