UPDATE sql 优化

一个网友说他的存储过程中有一段update sql,运行了15分钟还没出结果,需要优化一下

他把sql发给我

UPDATE TB_RESULT R SET R.VOTE_COUNT=NVL((
SELECT TEMP_.VOTE_COUNT
FROM (
SELECT RESULT_ID,
COUNT(RV_ID) AS VOTE_COUNT
FROM TB_RESULT_VOTE
GROUP BY RESULT_ID
) TEMP_
WHERE TEMP_.RESULT_ID = R.RESULT_ID),
R.VOTE_COUNT
);

看了这个update sql,把他拆成两个部分,红颜色的部分是优化的关键

SELECT TEMP_.VOTE_COUNT
FROM (
SELECT RESULT_ID,
COUNT(RV_ID) AS VOTE_COUNT
FROM TB_RESULT_VOTE
GROUP BY RESULT_ID
) TEMP_
WHERE TEMP_.RESULT_ID = R.RESULT_ID

这是一个很简单的sql,如果有问题基本上出现在from后的子查询中

而且很有意思这个自查询中的表没有筛选条件,就相当于全表扫描

他说这个表TB_RESULT_VOTE有90w

我让他发一下执行计划,发现全都是NL,执行计划是错的

这个sql的优化思路就是TB_RESULT与temp表要走hash 连接,temp表既然是全表扫描,需要固化并且要并行加载提高速度

这样就需要改写sql

with temp_ as (select /*+ materialize parallel(tb_result_vote,6) */result_id,count(rv_id) as vote_count from tb_result_vote group by result_id)
select /*+ use_hash(temp_,r)*/temp_.vote_count
from temp_,tb_result r
where temp_.result_id=r.result_id;

我让他运行这个sql,不到1s就出结果了

 

我的qq是343548233,希望和大家一起交流sql的优化,以及oracle方面的东西

posted on   Roc.Sun  阅读(338)  评论(0编辑  收藏  举报

编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

点击右上角即可分享
微信分享提示