共计 1100 个字符,预计需要花费 3 分钟才能阅读完成。
背景:在数据仓库中批量的导入数据的情况下,如果较多的约束存在那么会增加数据库的负担降低系统导入数据的效率,在这个情况下一般会采取牺牲约束的校验换取系统执行的效率。即禁用约束待数据全部导入成功以后再检查数据库中违反约束的数据,修改违规记录,最后重启约束。
一、禁用约束
alter table table_name disable novalidate constraint constraint_name
二、批量导入数据
三、在开启约束之前一定要检查违反约束的记录
1、执行 Oracle 中自带的脚本 utlexpt1.sql 创建 exceptions 表。该脚本在 oracle_home/rdbms/admin 目录下
sql>@oracle_home\rdbms\admin\utlexpt1.sql
2、执行带有 exception 是选项的 alter 语句, 将违反约束条件的记录添加到 exceptions 表中保存
alter table table_name enable validate constraint constraint_name exceptions into sys.exceptions;
3、在 exceptions 表中使用子查询来锁定无效的数据行
select column1,column2,column3 from table_name where rowid in(
select row_id from sys.exceptions
) for update
4、根据查询结果修改违反约束的记录行(可以通过 rowid 来直接 update)
5、重新执行带有 alter 的开启约束的语句
alter table table_name enable validate constraint constraint_name
6、查询约束的状态是否为 enable、validate
select constraint_name,constraint_type,status,validated from dba_constraints where owner=’OWNER’ and table_name=’TABLE_NAME’;
四、确认 exceptions 表无用后删除或者 truncate 表
drop table sys.exceptions;
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-01/139635.htm