2 个数仓中不等值关联优化案例
本文分享自华为云社区《GaussDB(DWS)性能调优:不等值关联优化》,作者: 门前一棵葡萄树。
场景 1
使用场景:本案例适合满足以下条件的场景
关联条件使用 OR 连接
关联条件中使用同一列做数据筛选
原始语句
性能分析
通过查询计划分析发现,t1 表和 t2 表关联走了 NEST LOOP,查询整体耗时 45S,NEST LOOP 耗时占用整个查询执行耗时的 96%。因此考虑能否通过 SQL 改写或 HINT 规避 NEST LOOP。观察发现 t1 表和 t2 表包含两个关联关联条件,两个关联条件之间使用 OR 连接,属于非等值关联,因此不能走 HASH JOIN。进一步分析 SQL 发现两个关联条件中都使用 t1.TYPE 进行过滤筛选:
该关联条件包含以下三种关联组合:
t1 表中 t1.TYPE='DR'的行,只能使用第一个关联条件与 t2 表关联;
t1 表中 t1.TYPE='ALL'的行,只能使用第二个关联条件与 t2 表关联;
t1 表中 t1.TYPE NOT IN ('ALL','DR')的行,不与 t2 表关联,直接补空。
t1 表中的一行数据只能选择这三个关联条件中的一个与 t2 表关联,因此该关联条件可以改写为不同关联条件的 UNION ALL(UNION 会去重,不等价)。
优化改写
改写后 SQL 如下所示:
改写后 SQL 变为三个子查询的 UNION ALL,执行时间缩减至 1s 以内,性能优化 45 倍。
场景二
使用场景:本案例适合满足以下条件的场景
大表 A 不等值关联小表 B
B 的等值关联字段为主键
【原始语句】
【性能分析】
原始语句执行超时(超过 1h),执行计划如下。可以看到执行语句存在大表 NestLoop 操作
分析发现表 dwrdim_dw1.dwr_dim_employee_d 是维度表,且关联列 employee_no 是主键
【优化改写】
改写后执行信息如下
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/6797488d853d7134ef428472f】。文章转载请联系作者。
评论