首页 > 其他分享 >数仓实践丨表扫描时过滤行数过多引起的性能瓶颈问题

数仓实践丨表扫描时过滤行数过多引起的性能瓶颈问题

时间:2023-11-08 11:36:38浏览次数:37  
标签:数仓 NAME 畅享 PERIOD QTY 过滤 SO 行数 ID

本文分享自华为云社区《GaussDB(DWS)性能调优:表扫描时过滤行数过多引起的性能瓶颈问题案例》,作者: O泡果奶~ 。

1、【问题描述】

SQL语句执行过程中,对12亿数据量的大表进行扫描,过滤99%的数据仅留617行数据,性能瓶颈位于扫描该表这里。

2、【原始语句】

set search_path = 'bi_dashboard';

WITH F_SRV_DB_DIM_PRD_D AS (SELECT EXTERNAL_NAME FROM ( SELECT MKT_NAME EXTERNAL_NAME  
               FROM BI_DASHBOARD.DM_MSS_ITEM_PRODUCT_D PRD
              WHERE PRD.COMPANY_BRAND =any(array[string_to_array('HUAWEI',',')])
                    
              AND PRD.MKT_NAME =any(array[string_to_array('畅享 60,畅享 50,畅享 60X,畅享 60 Pro,畅享 50 Pro,畅享 50z,nova 10z,畅享 20e,畅享20 Pro,畅享 10e,畅享10 Plus,畅享20 SE,畅享10,nova 11i,畅享20 Plus,畅享9 Plus,畅享20 5G,nova Y90,畅享 10S,nova Y70,畅享Z,畅享 9S,nova 8 SE 活力版,麦芒9 5G,Y9s,麦芒9 5G',',')])
                ) WHERE EXTERNAL_NAME<>'SNULL' GROUP BY EXTERNAL_NAME),

V_PERIOD AS
 (
  SELECT PERIOD_ID AS PERIOD_ID_M,
         LEAST(TO_CHAR(PERIOD_END_DATE, 'YYYYMMDD'), '20230630') AS PERIOD_ID,
         PERIOD_ID AS DATES
    FROM BI_DASHBOARD.RPT_TML_ACCOUNT_PERIOD_D
   WHERE PERIOD_TYPE = 'M'
     AND PERIOD_ID BETWEEN 202207 AND 202306
 ),
 
V_DATA_BASE AS 
 (
  SELECT A.PERIOD_ID,
         IFNULL(A.CHANNEL_NAME, 'SNULL') AS DISTRIBUTOR_CHANNEL_NAME,
         SUM(A.SO_QTY_MTD) AS SO_QTY,
         SUM(DECODE(A.PERIOD_ID, 20230630, A.SO_QTY_MTD)) AS SO_QTY_ORDER
 select count(*)   FROM DM_MSS_CN_PC_REP_RP_ST_D_F A 
   INNER JOIN F_SRV_DB_DIM_PRD_D PRD 
      ON A.EXTERNAL_NAME = PRD.EXTERNAL_NAME
   WHERE 1 = 1 
     AND A.CHANNEL_ID IN ('100013388802') 
     AND A.ORG_KEY IN (10000651) 
    
     AND A.SALES_FLAG IN ('1', '0')
     AND A.PERIOD_ID IN (20220731,20221031,20220930,20220831,20221130,20221231,20230131,20230228,20230430,20230331,20230531,20230630)
     AND (A.SO_QTY_MTD <> 0) -- 过滤所有日期SO_QTY为0的数据
   GROUP BY A.PERIOD_ID,
            IFNULL(A.CHANNEL_NAME, 'SNULL')
 ),
 
V_DATA AS
 (
  SELECT PERIOD_ID,
         NVL(DISTRIBUTOR_CHANNEL_NAME, 'Total') AS DISTRIBUTOR_CHANNEL_NAME,
         SUM(SO_QTY) AS SO_QTY,
         SUM(SO_QTY_ORDER) AS SO_QTY_ORDER
    FROM V_DATA_BASE A
   GROUP BY GROUPING SETS ((PERIOD_ID), (PERIOD_ID, DISTRIBUTOR_CHANNEL_NAME))
 )

  SELECT STRING_AGG(P.DATES, ',' ORDER BY P.PERIOD_ID_M) AS PERIOD_LIST,
         B.DISTRIBUTOR_CHANNEL_NAME,
         STRING_AGG(NVL(TO_CHAR(ROUND(A.SO_QTY)), '0'), ',' ORDER BY P.PERIOD_ID_M) AS SO_QTY
    FROM V_PERIOD P
    FULL JOIN (SELECT DISTINCT DISTRIBUTOR_CHANNEL_NAME FROM V_DATA) B
      ON 1 = 1
    LEFT JOIN V_DATA A
      ON A.PERIOD_ID = P.PERIOD_ID
     AND A.DISTRIBUTOR_CHANNEL_NAME = B.DISTRIBUTOR_CHANNEL_NAME
   GROUP BY B.DISTRIBUTOR_CHANNEL_NAME
   ORDER BY DECODE(B.DISTRIBUTOR_CHANNEL_NAME, 'Total', 0, 'SOURCE IS NULL', 2, '源为空', 3, 'SNULL', 4,  1), 
            SUM(A.SO_QTY_ORDER) DESC NULLS LAST
   LIMIT 50 OFFSET 0   

3、【性能分析】

image.png
image.png
从上图的performance执行计划中可以看出(完整执行计划放在附件一),该SQL语句慢在扫描表a(bi_dashboard.dm_mss_cn_pc_rep_rp_st_d_f_test)。扫描时过滤条件包括:sales_flag、so_qty_mtd、channel_id、org_key、period_id,该表上原本的局部聚簇键PCK只包含了period_id,并没有包括其余三个过滤条件之一,因此,可以调整PCK,以减少扫描表a的执行时间。

补充:局部聚簇键

局部聚簇 (Partial Cluster Key, 简称PCK),列存储下一种通过min/max稀疏索引实现基表快速扫描的索引技术。Partial Cluster Key可以指定多列,但是一般不建议超过2列。PCK适用于列存大表点查询加速。

另外,查看语句中where条件中in值较多(12个),在DWS中,in后面的条件默认就只能是5个,超过6个就过滤不下推,此时,可以用or将12个值改写,

A.PERIOD_ID IN (20220731,20221031,20220930,20220831,20221130)
or A.PERIOD_ID IN (20221231,20230131,20230228,20230430,20230331)
or A.PERIOD_ID IN (20230531,20230630)

image.png

此时,SQL语句执行时间减少为487ms,完整performance计划如附件二所示。

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

 

标签:数仓,NAME,畅享,PERIOD,QTY,过滤,SO,行数,ID
From: https://www.cnblogs.com/huaweiyun/p/17816979.html

相关文章

  • DRF的过滤和排序
    搜索组件、过滤排序组件'''排序:fromrest_framework.filtersimportOrderingFilter按id正序倒叙排序,按price正序倒叙排列使用:http://127.0.0.1:8000/course/free/?ordering=-id配置类:filter_backends=[OrderingFilter]配置字段:ordering_fields=['id','price&......
  • Asp.Net Core webapi+net6 使用资源筛选器(过滤器) 做缓存
    写一个特性类,用来做标记[AttributeUsage(AttributeTargets.Method)]//只对方法有效publicclassResourceFilterAttribute:Attribute{}我这里使用了MemoryCache来做缓存,也可以使用字典来做,但一定要加上static,否则字典每一次请求都会new一个实例,缓存的东西就丢了private......
  • 旅游管理与推荐系统Python+Django网页平台+协同过滤推荐算法
    一、介绍旅游管理与推荐系统。本系统使用Python作为主要编程语言,前端采用HTML、CSS、BootStrap等技术实现界面展示平台的开发,后端使用Django框架处理用户响应请求,并使用Ajax等技术实现前后端的数据通信。本系统主要功能有:系统分为两个角色:用户和管理员对于用户角色可以进行登......
  • 直播带货源码,android editText设置颜文字过滤
    直播带货源码,androideditText设置颜文字过滤 //给editText设置过滤器  InputFilterinputFilter=newInputFilter(){    //限制输入表情    Patternemoji=Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27f......
  • plsql 导入导出表数据,表结构 where 条件过滤,输入框输入 where 子查询(不需带where 关键
    plsql导入导出表数据,表结构where条件过滤,输入框输入where子查询(不需带where关键字)1.导出表结构,不含数据1.点击设置,点击导出表2.选择你要导出的表,在where字句填写1=2,点击导出即可2.导出表数据和结构在1的基础上,去掉where字句1=2,即可3.导入表结构和数据1.点击......
  • 面粉厂自动化控制系统如何进行数据采集远程监控
    现有一座面粉厂,厂内多条面粉生产线以实现自动化集中控制,产线设备均已接入工业控制计算机内,可以实现高效的自动化生产。工业控制计算机接收由PLC产生的数据,建立动态数据平台,而后数据同步上传到组态软件进行实时处理,实现动态显示和控制,其中工业智能网关发挥着重要的作用。 物通博联......
  • PHP如何过滤Emoji表情?
    微信和QQ两大即时通讯软件已经培养了用户频繁使用Emoji表情的习惯,现在就连各大输入法都支持直接输入Emoji表情了。所以为了避免用户提交的信息中含有Emoji表情,我们在开发系统的时候,遇到需要用户填写信息,提交资料的情况,就需要在后端对用户提交的信息进行过滤。今天就给大家分享一......
  • 美团增量数仓建设新进展
    摘要:本文整理自美团系统研发工程师汤楚熙,在FlinkForwardAsia2022实时湖仓专场的分享。本篇内容主要分为四个部分:建设背景核心能力设计与优化业务实践未来展望一、美团增量数仓的建设背景美团数仓架构的诞生是基于这样的技术假设:“随着业务数据越积越多,增量数据/存量数据的......
  • 2023年金融科技建模大赛(初赛)开箱点评-基于四川新网银行数据集
    原创作者Toby,文章来源公众号:python风控模型,2023年金融科技建模大赛(初赛)开箱点评各位同学大家好,我是Toby老师。2023年金融科技建模大赛(初赛)从今年10月14日开始,11月11日结束。比赛背景发展数字经济是“十四五”时期的重大战略规划。2023年,中共中央、国务院印发了《数字中国建设整体布......
  • MariaDB(MySQL)的常用命令3 【使用通配符过滤】
    第8章使用通配符过滤LIKE操作符百分号(%)通配符(匹配多个字符,类似?)SELECT*FROMstudentsWHEREemailLIKE'%@163.com';-下划线(_)通配符(匹配单个字符,类似*)SELECT*FROMstudentsWHEREnameLIKE'张_';Tips:1.查找的字符串,可能是大小......