优化数仓业务视图:过滤条件传递

打印 上一主题 下一主题

主题 1059|帖子 1059|积分 3177

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
摘要:在业务功能实现时,经常会用到视图简化查询SQL。但有时候会因为视图降低查询效率,本文主要分析在业务需求满足的情况下,将有效的过滤条件传递到基表,减少运算过程中数据库需要处理的数据量,提升SQL执行效率。
本文分享自华为云社区《GaussDB(DWS)业务视图优化-过滤条件传递》,作者:卫小毛 。
在业务功能实现时,经常会用到视图简化查询SQL。但有时候会因为视图降低查询效率,本文主要分析在业务需求满足的情况下,将有效的过滤条件传递到基表,减少运算过程中数据库需要处理的数据量,提升SQL执行效率。
SQL举例
  1. SELECT
  2.     count(1) AS have_done_num,
  3.     t1.task_def_key_ AS menuguid
  4. FROM
  5.     vw_pay_voucher_bill t2
  6. LEFT JOIN xact_hi_taskinst t1 ON t1.business_key_ = t2.id
  7. AND t1.proc_def_key_ = 'pay_voucher_bill'
  8. AND t1.operation_flag_ IN ('NORMAL', 'WITHDRAW')
  9. AND t1.suspension_state_ = 1
  10. AND t1.org_code_ = t2.mof_div_code
  11. AND delete_reason_ = 'completed'
  12. AND ext1_ IS NULL
  13. WHERE
  14.     t2.is_deleted = '2'
  15. AND t2.fiscal_year = '2022'
  16. AND t2.mof_div_code = 'xxxxxxxx0'
  17. AND (
  18.     agency_id = '5A1xxxxxxxxxxxxxxxxxxx4T5'
  19. )
  20. GROUP BY
  21.     t1.task_def_key_
  22. HAVING
  23.     t1.task_def_key_ IS NOT NULL;
复制代码
sql 分析:以上SQL vw_pay_voucher_bill t2 、xact_hi_taskinst t1 视图和表进行关联查询
根据业务特性分析过滤效果较好的字段为 agency_id
优化前耗时: 22s
分析执行计划:

时间主要耗时在 seq scan on pay_voucher_bill v 这一步
看到该表过滤条件仅有mof_div_code、fiscal_year、is_deleted 过滤效果差,几乎全表数据参与过程运算,执行代价高
视图及表结构分析:

视图中关联条件较为有效的过滤条件,bgt_id 字段查询时不会应用。分析视图中“v”和“t”表都存在agency_id 字段,当前t表过滤使用了agency_id字段,可以考虑视图定义中量表关联条件增加 agency_id 字段关联条件需要考虑业务需求。
同业务沟通后可进行优化
优化后耗时:0.4s
对比优化前后SQL查询结果一致
优化总结:

同业务侧研发沟通客户实际需要仅需要查询本单位 (agency_id) 下的数据,但因为SQL和视图设计时,并未将这一有效条件传递给每张表。导致数据库在针对 pay_voucher 进行数据过滤时需要将全表64万+ 数据筛选出来进行运算,仅仅这一步开销就占用了20s+。在优化后(视图中增加agency_id关联信息后,该操作可将agency_id 过滤条件传递给基表 pay_voucher),仅需从pay_voucher 表中获取738行数据进行运算,最终sql耗时降为 0.4s左右。
 
点击关注,第一时间了解华为云新鲜技术~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表