• 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方面的东西

  • 相关阅读:
    VS2010/MFC编程入门之四(MFC应用程序框架分析)
    VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)
    shell脚本学习一
    docker安装rabbitmq
    docker安装activemq
    docker搭建数据库主从复制
    在docker容器中安装vim命令进行编辑文件
    docker的常用操作
    docker上安装eslaticsearch
    centos7上面关闭防火墙
  • 原文地址:https://www.cnblogs.com/SUN-PH/p/4233071.html
Copyright © 2020-2023  润新知