zoukankan      html  css  js  c++  java
  • Oracle通过主键id删除记录很慢

    问题描述:

    Oracle通过主键id删除2000条记录很慢,需要花费十二分钟。

    解决过程:

    1.首先查看SQL的执行计划,执行计划正常,cost只有4,用到了主键索引。

    2.查看等待事件,

    select * from v$session_wait where sid = 507

    显示的event是db file sequential read,也没有异常。

    3.查看统计信息是否正常

    select * from user_tables where table_name = '';

    经检测,统计信息也是正常的。

    4.查看系统IO,也是正常的。

    5.找不到原因,开启SQL跟踪

    alter session set events='10046 trace name context forever,level 12';

    delete from t_table1 where id >= xxx

    alter session set events='10046 trace name context off';

    SQL跟踪得到一个trace文件

    tkprof orcl_ora_3708.trc myoutput.txt

    cat myoutput.txt,这次发现异常,文件里面除了有delete语句,还有两个select语句:

    select /*+ all_rows */ count(1)  from  "xxx"."T_TABLE2" where "FRESHMANID" = :1   call    count      cpu    elapsed      disk      query    current        rows  ------- ------  -------- ---------- ---------- ---------- ----------  ----------  Parse        1      0.00      0.00          0          0          0          0  Execute  2000      0.23      0.22          0          0          0          0  Fetch    2000    720.58    740.36        842  61038000          0        2000  ------- ------  -------- ---------- ---------- ---------- ----------  ----------  total    4001    720.82    740.59        842  61038000          0        2000

    select /*+ all_rows */ count(1)  from  "xxx"."T_TABLE3" where "FRESHMANID" = :1  

    call    count      cpu    elapsed      disk      query    current        rows  ------- ------  -------- ---------- ---------- ---------- ----------  ----------  Parse        1      0.00      0.00          0          0          0          0  Execute  2000      0.27      0.27          0          0          0          0  Fetch    2000      1.84      1.93          0    136000          0        2000  ------- ------  -------- ---------- ---------- ---------- ----------  ----------  total    4001      2.11      2.20          0    136000          0        2000

    这两张表各查询了2000次,可以判断出来,就是因为这个原因导致delete非常慢,询问现场相关人员,t_table2、t_table3跟t_table1有什么关系,现场人员说t_table2和t_table3个有一个外键

    依赖t_table1的主键ID,经过查询,t_table2和t_table3的外键上都没有创建索引,于是创建索引,再执行delete语句,这次执行速度很快,经过SQL跟踪,也没有发现去查询t_table2和t_table3。

    更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

    本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-04/100702.htm

  • 相关阅读:
    jQuery取得select选择的文本与值
    jquery 广告效果
    【JNI知识一】JNI接口函数与指针
    jQuery 中bind(),live(),delegate(),on() 区别(转)
    用angular怎么缓存父页面数据
    js条件判断时隐式类型转换
    常用原生JS方法
    gulp批量打包文件并提取公共文件
    angular下H5上传图片(可预览,可多张上传)
    angular4运行 ng build prod出错
  • 原文地址:https://www.cnblogs.com/smallrock/p/4129085.html
Copyright © 2011-2022 走看看