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

在平时的工作中,有时候需要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 所以启用错误日志可以根据大家的需求来选择,有利有弊。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-06-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

临时表空间的管理与受损恢复

      Oracle 临时表空间是Oracle数据库的重要组成部分,尽管该部分并没有cont体系结构上得以展现,但其重要地位也是不容忽视的。尤其是 对于大...

883
来自专栏Java Web

MyBatis(2)——MyBatis 深入学习

编写日志输出环境配置文件 在开发过程中,最重要的就是在控制台查看程序输出的日志信息,在这里我们选择使用 log4j 工具来输出: 准备工作: 将【MyBati...

3043
来自专栏java工会

Java后端开发猿不可不知的,Mybatis几种使用方式总结

1483
来自专栏SpringBoot 核心技术

第四章:使用QueryDSL与SpringDataJPA实现多表关联查询

1173
来自专栏IT可乐

mybatis 详解(六)------通过mapper接口加载映射文件

  通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的。那么什么是通过 mapper 接口加载映射文件呢?   我们首先看以前...

2450
来自专栏智能大石头

XCode v8.11 重量级分表分库(无视海量数据)

XCode天生就有分表分库功能,设计于2005年! 历时9年,这是分表分库功能第一次针对性正式更新。 在XCode里面,分表分库非常简单,在操作数据(查询/更...

19510
来自专栏坚毅的PHP

mysql DUPLICATE KEY UPDATE 问题

DUPLICATE KEY UPDATE batch执行时出死锁错误 背景知识 一、 mysql  insert 与 duplicate key: 典型的插入语...

3585
来自专栏跟着阿笨一起玩NET

SQL Server 2008使用自定义表类型

本文转载:http://www.cnblogs.com/chenxizhang/archive/2009/04/28/1445234.html

402
来自专栏Python研发

MySql[二]

视图就是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需要使用[名称]即可获取结果集并可以将其当做代表来使用·

1034
来自专栏数据库新发现

关于Oracle降序索引的定意及回溯

降序索引本质上是FBI,其具体定义可以通过 user_ind_expressions 或dba_ind_expressions 查询。 那么同样的,降序索引只有...

734

扫描关注云+社区