zoukankan      html  css  js  c++  java
  • 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方面的东西

  • 相关阅读:
    C#-获取页面源代码
    C#-获取页面源代码
    C#-窗体移动
    C#-窗体移动
    C#-窗体鼠标穿透
    C#-窗体鼠标穿透
    C#-string生成图片
    C#-string生成图片
    C#-Stmp发邮件
    POJ-1611 The Suspects
  • 原文地址:https://www.cnblogs.com/SUN-PH/p/4233071.html
Copyright © 2011-2022 走看看