首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >开发人员掌握了这个技术,SQL效率会有几百倍的性能提升

开发人员掌握了这个技术,SQL效率会有几百倍的性能提升

作者头像
老虎刘
发布于 2022-06-22 10:00:59
发布于 2022-06-22 10:00:59
31600
代码可运行
举报
运行总次数:0
代码可运行

完成相同业务逻辑的SQL,写法不同,执行效率可能会有几百上千倍的差距,今天我们通过几个案例来说明一下:

case1 :

原sql代码如下(执行时间1.2分钟):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with holder_clear_temp as
  ( select distinct t.principal_holder_account
    from ch_member.holder_account s, ch_member.clear_agency_relation t
    where s.holder_account = t.principal_holder_account      and s.holder_account_status = '1'
      and t.agency_status = '1'      and t.agency_type in ('1','2')
      and t.agency_holder_account = :1      and t.principal_holder_account != :2
  )  , holder_settle_temp as
  ( select t.principal_holder_account, t.product_category
    from ch_member.holder_account s, ch_member.settle_agency_rel t
    where s.holder_account = t.principal_holder_account
      and s.holder_account_status = '1'      and t.agency_status = '1'
      and t.agency_type in ('1','2')      and t.agency_holder_account = :3
      and t.principal_holder_account != :4
      and not exists
      ( select 1 from holder_clear_temp c where c.principal_holder_account=t.principal_holder_account  )
  ) , temp as
  ( select jour.BALANCE_CHG_SN
    from ch_his.HIS_ACCOUNT_CHG_BALANCE_JOUR jour
    inner join ch_stock.product_info info
      on (info.product_code = jour.product_code
        or 
        (info.pub_product_code = jour.product_code and info.has_distribution_flag='1'))
    where 1=1
      and (exists
      ( select 1 from holder_clear_temp c where jour.holder_account=c.principal_holder_account )
      or exists
      ( select 1 from holder_settle_temp s where jour.holder_account=s.principal_holder_account
          and info.product_Category =s.product_category
      ) )
      and jour.init_date >= :5  and jour.init_date <= :6
  union all
    select jour.BALANCE_CHG_SN
    from ch_stock.ACCOUNT_CHG_BALANCE_JOUR jour
    inner join ch_stock.product_info info
      on (info.product_code = jour.product_code
        or (info.pub_product_code = jour.product_code and info.has_distribution_flag='1'))
    where 1=1
      and ( exists
      ( select 1 from holder_clear_temp c where jour.holder_account=c.principal_holder_account )
      or exists
      ( select 1 from holder_settle_temp s
        where jour.holder_account=s.principal_holder_account and info.product_Category =s.product_category
      ) )
      and jour.init_date >= :7 and jour.init_date <= :8
  )
select count(1) from temp;

这个sql相对复杂一点,我们通过sql monitor显示的执行计划可以明显的看出瓶颈所在: 因为谓词条件使用了or 连接两个exists子查询,所以只能使用filter操作,而主查询返回的记录数又比较多,就导致sql执行时间比较长. 根据sql写法和执行计划反馈的信息,我们就可以通过改写来优化这个SQL.

sql monitor显示(部分):

建议有兴趣的朋友可以下载sql monitor文件,调动一下自己的思维,先自己分析一下该如何优化这个SQL . 我之前分享到微信群和QQ群,有一个群友已经找到了优化的核心所在,尽管还有一些小瑕疵.

注:sql monitor文件可以在QQ群16778072 下载. 这个sql monitor的"Plan Statistics"页面显示的执行计划有点不太正确,但是不影响大局."Plan"页面显示的是正常的.

改写后的SQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with holder_clear_temp as
  ( select distinct t.principal_holder_account
    from ch_member.holder_account s, ch_member.clear_agency_relation t
    where s.holder_account = t.principal_holder_account      and s.holder_account_status = '1'
      and t.agency_status = '1'      and t.agency_type in ('1','2')
      and t.agency_holder_account = '2110348'      and t.principal_holder_account != '2110348'
  )  , 
   holder_settle_temp as
  ( select t.principal_holder_account, t.product_category
    from ch_member.holder_account s, ch_member.settle_agency_rel t
    where s.holder_account = t.principal_holder_account
      and s.holder_account_status = '1'      and t.agency_status = '1'
      and t.agency_type in ('1','2')      and t.agency_holder_account = '2110348'
      and t.principal_holder_account != '2110348'
      and not exists
      ( select 1 from holder_clear_temp c where c.principal_holder_account=t.principal_holder_account  )
  ) , 
  exists_temp as
  (select principal_holder_account,'xx' as product_category  from holder_clear_temp
   union
   select principal_holder_account,product_category          from holder_settle_temp
  ),
  temp as
 ( 
  select jour.BALANCE_CHG_SN
    from ch_his.HIS_ACCOUNT_CHG_BALANCE_JOUR jour,ch_stock.product_info info,
         exists_temp uuu
    where info.product_code = jour.product_code
       and jour.holder_account=uuu.principal_holder_account 
       and (uuu.product_category='xx' or info.product_Category =uuu.product_category)
      and jour.init_date >= 20190205      
      and jour.init_date <= 20190505
 union all
   select jour.BALANCE_CHG_SN
    from ch_his.HIS_ACCOUNT_CHG_BALANCE_JOUR jour,ch_stock.product_info info,
         exists_temp uuu 
    where (info.pub_product_code = jour.product_code and info.has_distribution_flag='1')
       and jour.holder_account=uuu.principal_holder_account 
       and (uuu.product_category='xx' or info.product_Category =uuu.product_category)
      and jour.init_date >= 20190205      
      and jour.init_date <= 20190505
      and lnnvl(info.product_code = jour.product_code)
-------------------------------------------------------------------------------------      
  union all
    select jour.BALANCE_CHG_SN
    from ch_stock.ACCOUNT_CHG_BALANCE_JOUR jour
    inner join ch_stock.product_info info
      on (info.product_code = jour.product_code or (info.pub_product_code = jour.product_code and info.has_distribution_flag='1'))
    where 1=1
      and ( exists
          ( select 1 from holder_clear_temp c  where jour.holder_account=c.principal_holder_account )
           or 
           exists
          ( select 1 from holder_settle_temp s where jour.holder_account=s.principal_holder_account and info.product_Category =s.product_category
          ) )
      and jour.init_date >= 20190205 
      and jour.init_date <= 20190505
  )
select count(1) from temp;

改写效果:

经过改写后,原来执行1.2分钟的SQL,现场测试只需要耗时0.6秒(这个测试只改了耗时较长union all的上半部分,如果下半部分也做相同改写,预计最终执行时间不到0.3秒,性能提升达200多倍).

改写说明:

原sql用or 连接的两个exists ,存在相同的关联条件,我们通过一个union(注意不是union all)把它合并在一起,通过CTE(with as)定义为exists_temp ,然后就可以与主查询的两个表做关联,而不是做filter. 因为主查询两个表的关联关系也存在一个or,优化器必然会使用concat,那样就会拆分成4段做union all. 我只希望主查询做concat,就人工做了concat,将主查询拆分成了union all.

注:网上很多sql优化专家在对or 改写的时候,基本上全部改成了union,这是不等价的改写方法,标准改写请参考一下本例的union all配合lnnvl的写法.

case2:

原SQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT A.FLOW_INID, A.CURR_STEP, A.FLOW_NAME, A.FINS_NAME, 
      TO_CHAR(A.INST_CRDA, 'YYYY-MM-DD HH24:MI:SS') INST_CRDA, 'manual_rel' RELA_TYPE
FROM FLOW_INST A
WHERE EXISTS
  (SELECT 1
  FROM FLOW_RELATE_INFO B
  WHERE A.FLOW_INID = B.RELATE_FLOW_INID    AND B.FLOW_INID = :1
  )
  OR 
    EXISTS
  (SELECT 1
  FROM FLOW_RELATE_INFO B
  WHERE A.FLOW_INID = B.FLOW_INID    AND B.RELATE_FLOW_INID = :2
  )
UNION ALL
SELECT S.FLOW_INID, S.CURR_STEP, S.FLOW_NAME
, S.FINS_NAME, TO_CHAR(S.INST_CRDA, 'YYYY-MM-DD HH24:MI:SS') INST_CRDA, 'auto_rel' RELA_TYPE
FROM FLOW_INST S, 
(SELECT FI.FLOW_INID, FI.PARA_INID
  FROM FLOW_INST FI
  WHERE FI.FLOW_INID = :3
) F
WHERE ((F.FLOW_INID = S.PARA_INID  AND S.IF_SUB = 1) OR F.PARA_INID = S.FLOW_INID )  AND S.DEL_FLAG = 0;

执行计划:
----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name              | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                   |      1 |        |       |   194K(100)|          |      0 |00:00:01.83 |     352K|
|   1 |  UNION-ALL                     |                   |      1 |        |       |            |          |      0 |00:00:01.83 |     352K|
|*  2 |   FILTER                       |                   |      1 |        |       |            |          |      0 |00:00:01.83 |     352K|
|   3 |    TABLE ACCESS FULL           | FLOW_INST         |      1 |  57564 |  5115K|  1094   (1)| 00:00:14 |  58003 |00:00:00.05 |    4156 |
|*  4 |    TABLE ACCESS FULL           | FLOW_RELATE_INFO  |  58003 |      1 |    11 |     4   (0)| 00:00:01 |      0 |00:00:01.75 |     348K|
|   5 |   CONCATENATION                |                   |      1 |        |       |            |          |      0 |00:00:00.01 |       8 |
|   6 |    NESTED LOOPS                |                   |      1 |      1 |   106 |     3   (0)| 00:00:01 |      0 |00:00:00.01 |       3 |
|*  7 |     TABLE ACCESS BY INDEX ROWID| FLOW_INST         |      1 |      1 |     8 |     2   (0)| 00:00:01 |      0 |00:00:00.01 |       3 |
|*  8 |      INDEX UNIQUE SCAN         | PK_FLOW_INST      |      1 |      1 |       |     1   (0)| 00:00:01 |      1 |00:00:00.01 |       2 |
|*  9 |     TABLE ACCESS BY INDEX ROWID| FLOW_INST         |      0 |      1 |    98 |     1   (0)| 00:00:01 |      0 |00:00:00.01 |       0 |
|* 10 |      INDEX UNIQUE SCAN         | PK_FLOW_INST      |      0 |      1 |       |     0   (0)|          |      0 |00:00:00.01 |       0 |
|  11 |    NESTED LOOPS                |                   |      1 |      1 |   106 |     4   (0)| 00:00:01 |      0 |00:00:00.01 |       5 |
|  12 |     TABLE ACCESS BY INDEX ROWID| FLOW_INST         |      1 |      1 |     8 |     2   (0)| 00:00:01 |      1 |00:00:00.01 |       3 |
|* 13 |      INDEX UNIQUE SCAN         | PK_FLOW_INST      |      1 |      1 |       |     1   (0)| 00:00:01 |      1 |00:00:00.01 |       2 |
|* 14 |     TABLE ACCESS BY INDEX ROWID| FLOW_INST         |      1 |      1 |    98 |     2   (0)| 00:00:01 |      0 |00:00:00.01 |       2 |
|* 15 |      INDEX RANGE SCAN          | IDX_SUBFLOW_CHECK |      1 |      1 |       |     1   (0)| 00:00:01 |      0 |00:00:00.01 |       2 |
----------------------------------------------------------------------------------------------------------------------------------------------

分析:

这是一个OA系统的业务SQL,执行时间接近2秒. FLOW_RELATE_INFO 表只有480条记录,8 blocks.

在不改写SQL的情况下,我们可以通过创建FLOW_RELATE_INFO表上 (FLOW_INID,RELATE_FLOW_INID)两字段联合索引,将sql执行效率提高到0.37秒(OA系统相对可以接受的一个响应时间):

这个创建小表索引提升效率的方法,也是对那些小表不需要创建索引说法的一个反证.

如果我们改写这个sql,可以不需要创建索引,就能得到一个更好的性能提升:不到0.01秒.

SQL改写结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT A.FLOW_INID, A.CURR_STEP, A.FLOW_NAME
, A.FINS_NAME, TO_CHAR(A.INST_CRDA, 'YYYY-MM-DD HH24:MI:SS') INST_CRDA, 'manual_rel' RELA_TYPE
FROM FLOW_INST A
WHERE FLOW_INID in
  (SELECT RELATE_FLOW_INID
  FROM FLOW_RELATE_INFO
  WHERE FLOW_INID = '77913'
  union 
  SELECT FLOW_INID
  FROM FLOW_RELATE_INFO B
  WHERE RELATE_FLOW_INID= '77913'
  )
UNION ALL
SELECT S.FLOW_INID, S.CURR_STEP, S.FLOW_NAME
, S.FINS_NAME, TO_CHAR(S.INST_CRDA, 'YYYY-MM-DD HH24:MI:SS') INST_CRDA, 'auto_rel' RELA_TYPE
FROM FLOW_INST S, 
(SELECT FI.FLOW_INID, FI.PARA_INID
  FROM FLOW_INST FI
  WHERE FI.FLOW_INID = '77913'
) F
WHERE ((F.FLOW_INID = S.PARA_INID AND S.IF_SUB = 1) OR F.PARA_INID = S.FLOW_INID )
  AND S.DEL_FLAG = 0;
  
  执行计划:
  ----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name              | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                   |      1 |        |       |    19 (100)|          |      0 |00:00:00.01 |      20 |
|   1 |  UNION-ALL                     |                   |      1 |        |       |            |          |      0 |00:00:00.01 |      20 |
|   2 |   NESTED LOOPS                 |                   |      1 |      2 |   198 |    12  (17)| 00:00:01 |      0 |00:00:00.01 |      12 |
|   3 |    NESTED LOOPS                |                   |      1 |      2 |   198 |    12  (17)| 00:00:01 |      0 |00:00:00.01 |      12 |
|   4 |     VIEW                       | VW_NSO_1          |      1 |      2 |    16 |    10  (20)| 00:00:01 |      0 |00:00:00.01 |      12 |
|   5 |      SORT UNIQUE               |                   |      1 |      2 |    22 |    10  (20)| 00:00:01 |      0 |00:00:00.01 |      12 |
|   6 |       UNION-ALL                |                   |      1 |        |       |            |          |      0 |00:00:00.01 |      12 |
|*  7 |        TABLE ACCESS FULL       | FLOW_RELATE_INFO  |      1 |      1 |    11 |     4   (0)| 00:00:01 |      0 |00:00:00.01 |       6 |
|*  8 |        TABLE ACCESS FULL       | FLOW_RELATE_INFO  |      1 |      1 |    11 |     4   (0)| 00:00:01 |      0 |00:00:00.01 |       6 |
|*  9 |     INDEX UNIQUE SCAN          | PK_FLOW_INST      |      0 |      1 |       |     0   (0)|          |      0 |00:00:00.01 |       0 |
|  10 |    TABLE ACCESS BY INDEX ROWID | FLOW_INST         |      0 |      1 |    91 |     1   (0)| 00:00:01 |      0 |00:00:00.01 |       0 |
|  11 |   CONCATENATION                |                   |      1 |        |       |            |          |      0 |00:00:00.01 |       8 |
|  12 |    NESTED LOOPS                |                   |      1 |      1 |   106 |     3   (0)| 00:00:01 |      0 |00:00:00.01 |       3 |
|* 13 |     TABLE ACCESS BY INDEX ROWID| FLOW_INST         |      1 |      1 |     8 |     2   (0)| 00:00:01 |      0 |00:00:00.01 |       3 |
|* 14 |      INDEX UNIQUE SCAN         | PK_FLOW_INST      |      1 |      1 |       |     1   (0)| 00:00:01 |      1 |00:00:00.01 |       2 |
|* 15 |     TABLE ACCESS BY INDEX ROWID| FLOW_INST         |      0 |      1 |    98 |     1   (0)| 00:00:01 |      0 |00:00:00.01 |       0 |
|* 16 |      INDEX UNIQUE SCAN         | PK_FLOW_INST      |      0 |      1 |       |     0   (0)|          |      0 |00:00:00.01 |       0 |
|  17 |    NESTED LOOPS                |                   |      1 |      1 |   106 |     4   (0)| 00:00:01 |      0 |00:00:00.01 |       5 |
|  18 |     TABLE ACCESS BY INDEX ROWID| FLOW_INST         |      1 |      1 |     8 |     2   (0)| 00:00:01 |      1 |00:00:00.01 |       3 |
|* 19 |      INDEX UNIQUE SCAN         | PK_FLOW_INST      |      1 |      1 |       |     1   (0)| 00:00:01 |      1 |00:00:00.01 |       2 |
|* 20 |     TABLE ACCESS BY INDEX ROWID| FLOW_INST         |      1 |      1 |    98 |     2   (0)| 00:00:01 |      0 |00:00:00.01 |       2 |
|* 21 |      INDEX RANGE SCAN          | IDX_SUBFLOW_CHECK |      1 |      1 |       |     1   (0)| 00:00:01 |      0 |00:00:00.01 |       2 |
----------------------------------------------------------------------------------------------------------------------------------------------

case3:

原sql:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT C.fd_txtname As "文件名称",a.fd_start_time AS "开始时间",
       a.fd_end_time AS "结束时间",c.N AS "数据量"  
FROM dapdw.tb_dapetl_log_proc a
join dapdw.tb_dapetl_distribute_spool B on a.fd_proc_name=b.fd_id
join 
(SELECT 'YCCTOEAL_INSTALMENT_DYYMMDD.DAT' as fd_txtname,COUNT(1) as N FROM C_EAL_LOANDEPO_HIS where data_Dt = 20190217 and source_id ='YCC01' 
UNION ALL
SELECT 'YCCTOEAL_UNDRAWN_DYYMMDD.DAT',COUNT(1) FROM C_EAL_LOANDEPO_HIS where data_Dt = 20190217 and source_id ='YCC03' 
UNION ALL
SELECT 'YCCTOEAL_FEE_DYYMMDD.DAT',COUNT(1) FROM C_EAL_LOANDEPO_HIS where data_Dt = 20190217 and source_id ='YCC05' 
UNION ALL
SELECT 'NDSTOEAL_FXSPOT_DYYMMDD.DAT',COUNT(1) FROM C_EAL_LOANDEPO_HIS where data_Dt = 20190217 and source_id ='NDS04' 
UNION ALL
SELECT 'YI2TOEAL_LOAN_DYYMMDD.DAT',COUNT(1) FROM C_EAL_LOANDEPO_HIS where data_Dt = 20190217 and source_id ='YI201' 
UNION ALL
SELECT 'YRLTOEAL_CCFD_DYYMMDD.DAT',COUNT(1) FROM C_EAL_LOANDEPO_HIS where data_Dt = 20190217 and source_id ='YRL01' 
) C
ON C.fd_txtname=B.fd_txtname 
WHERE A.FD_DATE=20190217 
; 

sql分析:

union all部分的C_EAL_LOANDEPO_HIS 表占用空间几十G,以data_Dt字段按天分区,有50个分区,data_Dt字段是varchar2类型.

存在两个问题:

1.data_Dt字段类型不匹配,发生了隐式类型转换,无法实现分区裁剪.类型匹配只需要访问一个分区,但是使用number类型变量要访问全部50个分区.

2.C_EAL_LOANDEPO_HIS表6次重复访问,可以使用case when的写法,只需要访问一次.

解决了上面两个问题后,预计改写后的SQL,执行执行效率会是原来的50*6=300倍. 只需要将data_Dt=20190217改成data_Dt='20190217',然后再配合case when, 不需要union all,只需要访问C_EAL_LOANDEPO_HIS表一次就能实现原SQL的业务逻辑,这个改写比较简单,这里就不多做说明.

总结:

今天通过3个case 来谈谈sql写法的重要性: 实现相同逻辑,写法不同,可能会有成百上千倍的性能差异.

只有熟练掌握分析执行计划的方法,再加上对各种SQL低效写法的了解,才能让SQL得以用最少的资源,最快的速度,完成业务需求.

感谢大家的阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老虎刘谈oracle性能优化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一线运维 DBA 五年经验常用 SQL 大全(二)
本文 SQL 及相关命令均是在运维工作中总结整理而成的,对于运维 DBA 来说可提高很大的工作效率,值得收藏。当然如果你全部能够背下来那就很牛逼了,如果不能,还是建议收藏下来慢慢看,每条 SQL 的使用频率都很高,肯定能够帮助到你。
JiekeXu之路
2021/03/15
9920
一线运维 DBA 五年经验常用 SQL 大全(二)
开发人员必学的几点 SQL 优化点
博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。导出日志后分析,主要原因竟然是没有命中索引和没有分页处理。其实这是非常低级的错误,我不禁后背一凉,团队成员的技术水平亟待提高啊。改造这些SQL的过程中,总结了一些经验分享给大家,如果有错误欢迎批评指正。
龙哥
2020/03/24
8130
基于Hadoop生态圈的数据仓库实践 —— 进阶技术(十)
十、杂项维度 本节讨论杂项维度。简单地说,杂项维度就是一种包含的数据具有很少可能值的维度。例如销售订单,它可能有很多离散数据(yes-no这种类型的值),如
用户1148526
2019/05/25
3510
(中)史上最全干货!Flink SQL 成神之路(全文 18 万字、138 个案例、42 张图)
CREATE 语句用于向当前或指定的 Catalog 中注册库、表、视图或函数。注册后的库、表、视图和函数可以在 SQL 查询中使用。
公众号:大数据羊说
2022/04/04
6.7K0
(中)史上最全干货!Flink SQL 成神之路(全文 18 万字、138 个案例、42 张图)
ORACLE常用性能监控SQL【一】
kill session: 执行 alter system kill session ‘761,876’(sid 为 761);
小小工匠
2021/08/16
2.9K0
一文学完所有的Hive Sql(两万字最全详解)
lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的虚拟表。
五分钟学大数据
2021/04/02
3.4K0
流数据湖平台Apache Paimon(二)集成 Flink 引擎
Paimon目前支持Flink 1.17, 1.16, 1.15 和 1.14。本课程使用Flink 1.17.0。
Maynor
2023/07/31
3.6K0
流数据湖平台Apache Paimon(二)集成 Flink 引擎
Apache Doris 支持 Arrow Flight SQL 协议,数据传输效率实现百倍飞跃
近年来,随着数据科学、数据湖分析等场景的兴起,对数据读取和传输速度提出更高的要求。而 JDBC/ODBC 作为与数据库交互的主流标准,在应对大规模数据读取和传输时显得力不从心,无法满足高性能、低延迟等数据处理需求。为提供更高效的数据传输方案,Apache Doris 在 2.1 版本中基于 Arrow Flight SQL 协议实现了高速数据传输链路,使得数据传输性能实现百倍飞跃。
SelectDB技术团队
2024/04/07
8680
Greenplum 实时数据仓库实践(7)——维度表技术
前面章节中,我们实现了实时多维数据仓库的基本功能,如使用Canal和Kafka实现实时数据同步,定义Greenplum rule执行实时数据装载逻辑等。本篇将继续讨论常见的维度表技术。
用户1148526
2022/01/06
2.7K0
Greenplum 实时数据仓库实践(7)——维度表技术
使用OGG 21c迁移Oracle 12c到MySQL 8.0并配置实时同步
OGG有传统的经典架构,也有最新的微服务,2个都可以远程捕获和应用数据,对数据库服务器是0侵入,而传统的经典架构是纯命令行模式,最新的微服务架构是图形化界面操作,几乎所有操作都可以在界面进行。相关文章可以参考:
AiDBA宝典
2023/04/26
1.5K0
使用OGG 21c迁移Oracle 12c到MySQL 8.0并配置实时同步
Oracle RAC基本维护指令
所有实例和服务的状态 $ srvctl status database -d orcl Instance orcl1 is running on node linux1 Instance orcl2 is running on node linux2 单个实例的状态 $ srvctl status instance -d orcl -i orcl2 Instance orcl2 is running on node linux2 在数据库全局命名服务的状态 $ srvctl status serv
猿人谷
2018/01/17
1.2K0
查询性能提升3倍!Apache Hudi 查询优化了解下?
从 Hudi 0.10.0版本开始,我们很高兴推出在数据库领域中称为 Z-Order和 Hilbert 空间填充曲线的高级数据布局优化技术的支持。
ApacheHudi
2022/01/04
1.8K0
查询性能提升3倍!Apache Hudi 查询优化了解下?
SQL优化案例解析:MINUS改写为标量子查询后提升5倍,但还可以再快近百倍
* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 写在前面(By老叶)从GreatSQL 8.0.32-25版本开始支持Rapid引擎,该引擎使得GreatSQL能满足联机分析(OLAP)查询请求。老叶尝试利用Rapid引擎优化本案例,结果是相当可喜的,对比如下: -SQL执行耗时(秒)Rows_examinedRead_keyRead_nextRead_rnd_nextTmp_tablesTmp_disk_tablesTmp_table_sizesInnoDB_pages_distinct原始SQL9.943230200036368909070210877403112372448181标量子查询改写优化后2.294906728836617308100036382011284368182走Rapid引擎0.11763300001090000 上述测试结果表明:
老叶茶馆
2024/04/03
2630
SQL优化案例解析:MINUS改写为标量子查询后提升5倍,但还可以再快近百倍
最强最全面的Hive SQL开发指南,超四万字全面解析!
hive -S -e 'select table_cloum from table' -S,终端上的输出不会有mapreduce的进度,执行完毕,只会把查询结果输出到终端上。
五分钟学大数据
2021/12/02
8.4K0
最强最全面的Hive SQL开发指南,超四万字全面解析!
腾讯技术团队出品的《面向开发人员梳理的代码安全指南-Go安全指南》
使用"net/http"下的方法http.Get(url)、http.Post(url, contentType, body)、http.Head(url)、http.PostForm(url, data)、http.Do(req)时,如变量值外部可控(指从参数中动态获取),应对请求目标进行严格的安全校验。
公众号: 云原生生态圈
2021/09/26
1.4K0
大数据技术之_27_电商平台数据分析项目_03_项目概述 + 项目主体架构 + 模拟业务数据源 + 程序框架解析 + 需求解析 + 项目总结
1、user_visit_action user_visit_action 表,存放网站或者 APP 每天的点击流数据。通俗地讲,就是用户对 网站/APP 每点击一下,就会产生一条存放在这个表里面的数据。
黑泽君
2019/06/14
3.9K0
大数据技术之_27_电商平台数据分析项目_03_项目概述 + 项目主体架构 + 模拟业务数据源 + 程序框架解析 + 需求解析 + 项目总结
Greenplum 实时数据仓库实践(8)——事实表技术
上一篇里介绍了几种基本的维度表技术,并用示例演示了每种技术的实现过程。本篇说明多维数据仓库中常见的事实表技术。我们将讲述五种基本事实表扩展技术,分别是周期快照、累积快照、无事实的事实表、迟到的事实和累积度量。和讨论维度表一样,也会从概念开始认识这些技术,继而给出常见的使用场景,最后以销售订单数据仓库为例,给出实现代码和测试过程。
用户1148526
2022/04/13
1.9K0
Greenplum 实时数据仓库实践(8)——事实表技术
数据仓库开发 SQL 使用技巧总结
作者:dcguo 使用 sql 做数仓开发有一段时间了,现做一下梳理复盘,主要内容包括 sql 语法、特性、函数、优化、特殊业务表实现等。 mysql 数据结构 常用 innodb 存储为 B+ 树 特点 多路平衡树,m 个子树中间节点就包含 m 个元素,一个中间节点是一个 page(磁盘页) 默认 16 kb; 子节点保存了全部得元素,父节点得元素是子节点的最大或者最小元素,而且依然是有序得; 节点元素有序,叶子节点双向有序,便于排序和范围查询。 优势 平衡查找树,logn 级别 crud; 单一节点比二
腾讯技术工程官方号
2022/07/19
3.5K0
数据仓库开发 SQL 使用技巧总结
salesforce的功能_salesforce开发
161、【String.format escape curly braces – 转义花括号】:
全栈程序员站长
2022/11/01
7.4K0
salesforce的功能_salesforce开发
基于Hadoop生态圈的数据仓库实践 —— 进阶技术
五、快照 前面实验说明了处理维度的扩展。本节讨论两种事实表的扩展技术。 有些用户,尤其是管理者,经常要看某个特定时间点的数据。也就是说,他们需要数据的快照。周期快照和累积快照是两种常用的事实表扩展技术。 周期快照是在一个给定的时间对事实表进行一段时期的总计。例如,一个月销售订单周期快照汇总每个月底时总的销售订单金额。 累积快照用于跟踪事实表的变化。例如,数据仓库可能需要累积(存储)销售订单从下订单的时间开始,到订单中的商品被打包、运输和到达的各阶段的时间点数据来跟踪订单生命周期的进展情况。用户可能要取得在某个给定时间点,销售订单处理状态的累积快照。 下面说明周期快照和累积快照的细节问题。 1. 周期快照 下面以销售订单的月底汇总为例说明如何实现一个周期快照。 首先需要添加一个新的事实表。下图中的模式显示了一个名为month_end_sales_order_fact的新事实表。
用户1148526
2019/05/25
7010
推荐阅读
相关推荐
一线运维 DBA 五年经验常用 SQL 大全(二)
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验