前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >请你来试试这个SQL的优化,感受一下改写的效果

请你来试试这个SQL的优化,感受一下改写的效果

作者头像
老虎刘
发布2022-06-27 13:56:59
2691
发布2022-06-27 13:56:59
举报
文章被收录于专栏:老虎刘谈oracle性能优化

下面这个生产系统上的SQL,开了8个并行, 执行时间2小时:

原SQL简化如下:

INSERT INTO dest

(

SELECT ACCOUNT_NUMBER, A.ORG_UNIT_ID , CUR_BOOK_BAL * A.BL AS CUR_BOOK_BAL

FROM T, A

WHERE SUBSTR (T.ACCOUNT_NUMBER, 1, LENGTH (A.ACCOUNT_ID)) = A.ACCOUNT_ID

UNION ALL

SELECT ACCOUNT_NUMBER, T.ORG_UNIT_ID , CUR_BOOK_BAL * (1 - A.BL) AS CUR_BOOK_BAL

FROM T, A

WHERE SUBSTR (T.ACCOUNT_NUMBER, 1, LENGTH (A.ACCOUNT_ID)) = (CASE WHEN 1 - A.BL <> 0 THEN A.ACCOUNT_ID END)

);

其中T表170万记录, A表5000条记录, 没有任何索引.

现在想把这个SQL优化到5秒以内,不要并行, union all也去掉, 能不能实现?

已经有人给出一个with的改写方法, 大家可以参考一下.效率提升能接近1倍, 但是没有去掉union all,离5秒以内的目标也还有很大差距:

INSERT INTO dest

WITH TEMP AS

(

SELECT ACCOUNT_NUMBER, A.ORG_UNIT_ID ID1, T.ORG_UNIT_ID ID2, CUR_BOOK_BAL, A.BL

FROM T, A

WHERE SUBSTR (T.ACCOUNT_NUMBER, 1, LENGTH (A.ACCOUNT_ID)) = A.ACCOUNT_ID

)

SELECT ACCOUNT_NUMBER , ID1 AS ORG_UNIT_ID,CUR_BOOK_BAL * BL AS CUR_BOOK_BAL

FROM TEMP

UNION ALL

SELECT ACCOUNT_NUMBER , ID2 AS ORG_UNIT_ID,CUR_BOOK_BAL * (1 - BL) AS CUR_BOOK_BAL

FROM TEMP

WHERE 1 - BL <> 0;

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档