前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >insert中启用错误日志的问题及分析(r2第10天)

insert中启用错误日志的问题及分析(r2第10天)

作者头像
jeanron100
发布2018-03-14 15:04:18
9080
发布2018-03-14 15:04:18
举报

在平时的工作中,有时候需要insert一批数据,这些数据可能是临时表,外部表,普通表,子查询等形式,类似下面的格式 insert into xxxx (select xxxxx from xxx where xxxxx); 如果其中有冗余数据的时候,整个Insert会自动rollback,一条数据也插不进去,错误类似下面的形式。 insert /*+ append */into mo1_memo select *from MO1_MEMO_EXT_92; * ERROR at line 1: ORA-00001: unique constraint (MIG_TEST.MO1_MEMO_PK) violated 可能我们想保证正常数据能够插入,对于违反约束等的数据稍后处理,这个是用错误日志就是一个很好的选择。 首先就是创建错误日志,可以使用提供的包来创建,也可以手动创建。 这里我需要用到表含有lob字段,创建错误日志的时候有下面的错误。 EXEC DBMS_ERRLOG.create_error_log(dml_table_name => 'MO1_MEMO') BEGIN DBMS_ERRLOG.create_error_log(dml_table_name => 'MO1_MEMO'); END; ERROR at line 1: ORA-20069: Unsupported column type(s) found: MEMO_SYSTEM_TEXT_C ORA-06512: at "SYS.DBMS_ERRLOG", line 235 ORA-06512: at line 1 不过想想也是合理的。不过问题还是要解决的。 可以看看创建错误日志的包,oracle已经考虑到了,我们可以忽略这种不支持的类型,当然还可以指定错误日志的名字。 SQL> desc dbms_errlog PROCEDURE CREATE_ERROR_LOG Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- DML_TABLE_NAME VARCHAR2 IN ERR_LOG_TABLE_NAME VARCHAR2 IN DEFAULT ERR_LOG_TABLE_OWNER VARCHAR2 IN DEFAULT ERR_LOG_TABLE_SPACE VARCHAR2 IN DEFAULT SKIP_UNSUPPORTED BOOLEAN IN DEFAULT 我们创建错误日志 SQL> EXEC DBMS_ERRLOG.create_error_log(dml_table_name => 'MO1_MEMO',SKIP_UNSUPPORTED=>true,ERR_LOG_TABLE_NAME=>'MO1_MEMO_ERROR'); PL/SQL procedure successfully completed. Elapsed: 00:00:00.03 尝试插入有冗余的数据, SQL> insert /*+ append */into mo1_memo select *from MO1_MEMO_EXT_92 LOG ERRORS INTO MO1_MEMO_ERROR('test_unique') REJECT LIMIT UNLIMITED 2 / insert /*+ append */into mo1_memo select *from MO1_MEMO_EXT_92 LOG ERRORS INTO MO1_MEMO_ERROR('test_unique') REJECT LIMIT UNLIMITED * ERROR at line 1: ORA-00001: unique constraint (MIG_TEST.MO1_MEMO_PK) violated Elapsed: 00:00:17.32 直接抛了错误,看来错误日志没有正确启用。 查看错误日志,里面也是空的。

SQL> SELECT *FROM MO1_MEMO_ERROR; --no rows 反复尝试,最后发现是Hint的原因,去掉Hint 就没有问题了。 SQL> insert into mo1_memo select *from MO1_MEMO_EXT_92 LOG ERRORS INTO MO1_MEMO_ERROR('test_unique') REJECT LIMIT UNLIMITED; 99 rows created. Elapsed: 00:04:04.83

1* select count(*)from mo1_memo_error SQL> / COUNT(*) ---------- 907544 错误日志里面有详细的数据信息。但是如果足够细心查看执行时间的话,就会发现如果不使用append,性能就会差很多。 下面是一个简单的测试, 如果不使用append的时候,插入80万左右的数据在1分钟左右,如果使用了append就只需要大概13秒左右。 还有上面的测试结果,如果80万记录中99%左右的数据有冗余,插入错误日志就需要大概4分钟的样子 SQL> insert into mo1_memo select * from mo1_memo_ext_99 LOG ERRORS INTO MO1_MEMO_ERROR REJECT LIMIT UNLIMITED; 877245 rows created. Elapsed: 00:01:12.91 SQL> insert into mo1_memo select * from mo1_memo_ext_98; 753637 rows created. Elapsed: 00:01:04.75 SQL> rollback; Rollback complete. Elapsed: 00:00:56.35 SQL> insert /*+append*/ into mo1_memo select *from mo1_memo_ext_98; 753637 rows created. Elapsed: 00:00:13.20 所以启用错误日志可以根据大家的需求来选择,有利有弊。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档