暂无图片
关于db2并发插入以及语句优化的问题
我来答
分享
拥有Masbfca
2019-07-05
关于db2并发插入以及语句优化的问题

INSERT INTO ODS.A_BI_JYMX_M_07

(

FK_SAACN_KEY,

SA_CUST_NAME,

SA_CERT_ID,

SUM_SA_CR_AMT_LOAN ,

SUM_SA_DR_AMT_REPAY

)

SELECT A.FK_SAACN_KEY,

B.SA_CUST_NAME,

B.SA_CERT_ID,

SUM(SA_CR_AMT) SUM_SA_CR_AMT_LOAN ,

SUM(SA_DR_AMT) SUM_SA_DR_AMT_REPAY

FROM ODSHIS.S_CBOD_SAACNTXN A

LEFT JOIN ODSHIS.S_CBOD_SAACNACN B

ON A.FK_SAACN_KEY=B.SA_ACCT_NO

WHERE A.SA_TX_DT > V_LAST_YEAR

AND A.SA_TX_DT<= P_CALLED_DT

AND SA_OP_CUST_NAME IN(SELECT SA_OP_CUST_NAME FROM ODS.A_BI_JYMX_M_061_3)

AND SUBSTR(B.SA_PDP_CODE,6,1)=0

GROUP BY FK_SAACN_KEY,B.SA_CUST_NAME,B.SA_CERT_ID

以上为sql语句,A表数据量较大,达到1个亿,B表240万 ,v_lastyear为存储过程定义的变量,举例子‘20171231’ pcalldt也类似,在执行到这一步时非常慢,请问专家对比语句的优化有何建议,还有请问下db2是否有类似于oracle 的并行查询的语句(类似于parallel)

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
渔舟唱晚

FK_SAACN_KEY,SA_ACCT_NO 是否存在索引?

SA_TX_DT,SA_OP_CUST_NAME 是否存在索引?

插入是否可以取消group by

插入表的属性可以修改为 append on


暂无图片 评论
暂无图片 有用 0
柚子身上依
  1. 通过查看你的sql语句,不能确定表ODSHIS.S_CBOD_SAACNTXN是否是分区表,最好将这张大表ODSHIS.S_CBOD_SAACNTXN按照SA_TX_DT创建成为分区表

  2. 表ODSHIS.S_CBOD_SAACNTXN和ODSHIS.S_CBOD_SAACNACN如果经常进行DML操作,需要对表进行reorgs、runstats

        通过下面语句查看是否需要做reorg和runstats:

        select card,stats_time from syscat.tables where tabschema='ODSHIS' and tabname in('S_CBOD_SAACNTXN','S_CBOD_SAACNTXN'); 

        select count(1) from ODSHIS.S_CBOD_SAACNTXN; 

        select count(1) from ODSHIS.S_CBOD_SAACNACN;

        下面的情况需要对表做reorgs和runstats操作:

        a. 如果上述语句的stats_time为null或者card为-1说明一直没有作为收集表统计信息的操作

        b.如果stats_time不为空,但是日期和当前日期有些差距并且card值与count(1)的结果差距比较大

        c.reorgs、runstats语句参考

        db2 reorg table ODSHIS.S_CBOD_SAACNTXN

        db2 runstats on table ODSHIS.S_CBOD_SAACNTXN

        d.如果表数据量很大,执行reorgs、runstats时尽量在数据库空闲时操作

3. 通过查看此语句的执行计划判断性能瓶颈处在哪里

        db2expln -d dbname -statement "SQL语句" -graph -t>insert.expln

        --V_LAST_YEAR、P_CALLED_DT等传入的值需要替换成真实值

        --通过查看sql的执行计划分析那些地方的评估耗时较多

4.通过db2advis查看sql执行效率及索引优化建议

        db2advis -d dbname -s "SQL语句" -t 2

        --V_LAST_YEAR、P_CALLED_DT等传入的值需要替换成真实值

        --根据improvement提升的百分比创建推荐的索引

        --可能会推荐创建多个索引,根据索引使用的频率及要创建的索引大小来评估是否需要创建

5.是否可以把LEF JOIN改成INNER JOIN,前提是保证数据的一致


暂无图片 评论
暂无图片 有用 0
拥有Masbfca

感谢专家的回答,因为此前听别人讲已有分区,经过核实A表并无分区,先在拟为表A创建分区,分区字段为SA_TX_DT,第一个分区开始时间为20110101,结束时间为20111231,此后的分区按照第一个分区一年一个,在网上查资料关于DB2分区的资料很少,请专家指导一下如何写这个分区语句,目前改表无任何分区。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏