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 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2102
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2496
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

3955
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2888
来自专栏ASP.NETCore

ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninjec...

674
来自专栏魂祭心

原 canvas绘制clock

4004
来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4054
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2517
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3035
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2605

扫码关注云+社区