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

  • 相关阅读:
    Docker创建tomcat镜像简单使用
    Eclipse和Jdk版本问题
    HashTable源码阅读
    HashMap源码阅读
    报错:Multiple annotations found at this line:
    python全栈开发学习03
    python全栈开发学习 02
    关于termux在手机上搭载Linux系统,python,ssh
    python全栈开发学习 01
    机器学习实战
  • 原文地址:https://www.cnblogs.com/smallrock/p/4129085.html
Copyright © 2011-2022 走看看