暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 重新启用外键约束需要很长时间

askTom 2018-01-29
694

问题描述

我在Solaris 11 64bit上有两个11.2.0.3数据库。他们都有相同的模式。一个大约。1gb,另一个大约。10gb。在两个数据库上,都有一个父表和子表,其记录数量相似 (每个记录约300k)。

从旧代码中,以前的DBA禁用了外键约束,对父表和子表进行了一些插入,然后重新启用了外键。

在较小的数据库上,此操作需要 <1秒。在较大的数据库中,此操作需要1.5分钟。

在对每条指令计时后,我将其缩小到重新启用导致瓶颈,但我不知道为什么一个实例 <1秒,另一个实例 <1.5分钟。我想这是因为尺寸。但是我不确定如何向我的经理证实这一点。我不能使用解释计划。

有没有办法量化或确定造成时间差异的原因?

专家解答

跟踪验证!

create table t1 (x primary key) as 
  select level x from dual
  connect by level <= 1000;
  
create table t2 as 
  select t.x, r.y
  from   t1 t, 
         ( select level y from dual connect by level <= 10 ) r;
         
alter table t2 add constraint fk 
  foreign key ( x ) references t1 ( x) disable;
  
alter session set tracefile_identifier = chris;
exec dbms_monitor.session_trace_enable(waits => true);

alter table t2 modify constraint fk enable;

exec dbms_monitor.session_trace_disable();
复制


跟踪文件包含数据库运行的查询以及它们需要多长时间。以您最喜欢的方式对其进行格式化,以查看发生了什么。

在文件中的某个地方,你会看到这样的语句:

select /*+ all_rows ordered dynamic_sampling(2) */ A.rowid, :1, :2, :3
from   "CHRIS"."T2" A , "CHRIS"."T1" B 
where( "A"."X" is not null) 
and( "B"."X" (+)= "A"."X") and( "B"."X" is null);
复制


这可能是最慢的部分。如果是,请阅读以下选项:

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:9537205800346527774
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论