首页 > 其他分享 >优化数仓业务视图:过滤条件传递

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

时间:2023-02-08 15:34:34浏览次数:68  
标签:数仓 agency 视图 t1 过滤 SQL id

摘要:在业务功能实现时,经常会用到视图简化查询SQL。但有时候会因为视图降低查询效率,本文主要分析在业务需求满足的情况下,将有效的过滤条件传递到基表,减少运算过程中数据库需要处理的数据量,提升SQL执行效率。

本文分享自华为云社区《GaussDB(DWS)业务视图优化-过滤条件传递》,作者:卫小毛 。

在业务功能实现时,经常会用到视图简化查询SQL。但有时候会因为视图降低查询效率,本文主要分析在业务需求满足的情况下,将有效的过滤条件传递到基表,减少运算过程中数据库需要处理的数据量,提升SQL执行效率。

SQL举例

SELECT
    count(1) AS have_done_num,
    t1.task_def_key_ AS menuguid
FROM
    vw_pay_voucher_bill t2
LEFT JOIN xact_hi_taskinst t1 ON t1.business_key_ = t2.id
AND t1.proc_def_key_ = 'pay_voucher_bill'
AND t1.operation_flag_ IN ('NORMAL', 'WITHDRAW')
AND t1.suspension_state_ = 1
AND t1.org_code_ = t2.mof_div_code
AND delete_reason_ = 'completed'
AND ext1_ IS NULL
WHERE
    t2.is_deleted = '2'
AND t2.fiscal_year = '2022'
AND t2.mof_div_code = 'xxxxxxxx0'
AND (
    agency_id = '5A1xxxxxxxxxxxxxxxxxxx4T5'
)
GROUP BY
    t1.task_def_key_
HAVING
    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左右。

 

点击关注,第一时间了解华为云新鲜技术~

标签:数仓,agency,视图,t1,过滤,SQL,id
From: https://www.cnblogs.com/huaweiyun/p/17101948.html

相关文章

  • 【转载】过滤器+spring拦截器处理服务请求日志打印
    思路:通过拦截器拦截HttpServletRequest请求,从请求对象中获取请求流,解析请求参数,封装对象打印请求参数日志痛点:Requestbody只能读取一次,因为是流。想想看,java中的流也是......
  • wireshark过滤器
    一:过滤器使用wireshark工具抓包,如果使用默认配置,会得到大量的数据,所以我们就很难找到我们要分析的封包数据。所以使用wireshark过滤器就显得尤为重要。wireshark过滤器......
  • drf认证,权限,频率,过滤,分页
    内容回顾两个视图基类APIViewGenericAPIView:跟数据库打交道,而且需要序列化反序列化,可以使用它5个视图扩展类+GenericAPIView=视图类ListModelMixinCreateModelMixin......
  • 认证组件 权限组件 频率组件 过滤排序 分页
    目录回顾认证组件认证组件的使用步骤注意:权限组件权限的使用频率组件使用步骤过滤排序继承APIView写内置过滤类的使用,继承GenericAPIView使用第三方django-filter实现过滤......
  • DRF - 过滤与排序、分页组件
    目录过滤与排序1.drf内置过滤类【继承GenericAPIView】导入内置过滤器-SearchFilterviews.py-搜索方式2.第三方过滤器导入模块这里用到了第三方模块django-filtersviews......
  • DRF - 过滤与排序、分页器
    目录频率组件1.频率限制2.频率认证步骤3.全局使用和局部使用(1)局部权限:对单独的视图类生效(2)全局权限:对于全局的视图类生效(3)全局权限+局部禁用4.代码演示throttling.py-......
  • drf权限组件 频率组件 过滤排序 分页
    1认证组件#以后,有的接口需要登录才能访问,有的接口,不等了就能访问 -登录认证的限制#写一个登录接口,返回token,以后只要带着token过来,就是登陆了,不带就是没有登录#......
  • drf之三大认证、过滤、排序、分页组件
    drf之三大认证、过滤、排序、分页组件本文所介绍的组件,都有着很相似的配置方式,继承组件类,类体中配置参数,视图类中配置参数添加对应的组件类或者全局配置,我们就可以方便的......
  • drf-认证、权限、频率、过滤、排序、分页
    1.认证组件1.1局部认证1.首先写两个接口,一个查询单个一个查询所有,我们利用视图扩展类和视图子类写在一个视图类上:views.py:fromrest_framework.viewsetsimportVie......
  • 认证组件、权限组件、频率组件、过滤排序、分页
    认证组件、权限组件、频率组件、过滤排序、分页认证组件1.认证组件###视图fromrest_framework.genericsimportListAPIView,RetrieveAPIViewfromrest_framework.m......