当前位置: 首页 > news >正文

oracle 批量insert 锁,oracle nologging 和批量insert

当前session产生的redo

SQL> create or replace view redo_size

2 as

3 select value

4 from v$mystat, v$statname

5 where v$mystat.statistic# = v$statname.statistic#

6 and v$statname.name = 'redo size';

SQL> archive log list

Database log modeNo Archive Mode

Automatic archivalDisabled

Archive destination/u01/app/oracle/product/9.2.0.4/dbs/arch

Oldest online log sequence4564

Current log sequence4566

SQL> grant select on redo_size to zhf;

Grant succeeded.

SQL> conn zhf/zhf

Connected.

SQL> create table redo_test as select * from all_objects where 0=1;

Table created.

SQL> select * from sys.redo_size;

VALUE

----------

46524

SQL> insert into redo_test select * from all_objects;

21991 rows created.

SQL> select * from sys.redo_size;

VALUE

----------

2521696

SQL> insert /*+ append */ into redo_test

2select * from all_objects;

21991 rows created.

SQL> commit;

Commit complete.

SQL> select * from sys.redo_size;

VALUE

----------

2528548

SQL> select 2521696-46524, 2528548-2521696 from dual;

2521696-46524 2528548-2521696

------------- ---------------

24751726852

/*

*noarchivelog mode, table: logging可以看到insert /*+ append */ into方式redo产生很少.

*/

SQL> alter table redo_test nologging;

Table altered.

SQL> select * from sys.redo_size;

VALUE

----------

2530400

SQL> insert into redo_test select * from all_objects;

21991 rows created.

SQL> commit;

Commit complete.

SQL> select * from sys.redo_size;

VALUE

----------

4972372

SQL> insert /*+ append */ into redo_test

2select * from all_objects;

21991 rows created.

SQL> commit;

Commit complete.

SQL> select * from sys.redo_size;

VALUE

----------

4979460

SQL> select 4972372 -2530400, 4979460 -4972372 from dual;

4972372-2530400 4979460-4972372

--------------- ---------------

24419727088

*****非归档模式下表的nologging状态对于redo影响不大

结论:在非归档模式下通过insert /*+ append */ into方式批量加载数据可以大大减少redo产生.

in archive log mode:

SQL> archive log list;

Database log modeArchive Mode

Automatic archivalEnabled

SQL> select * from sys.redo_size;

VALUE

----------

56400

SQL> insert /*+ append */ into redo_test

2select * from all_objects;

2745 rows created.

SQL> commit;

Commit complete.

SQL> select * from sys.redo_size;

VALUE

----------

347024

SQL> insert into redo_test select * from all_objects;

2745 rows created.

SQL> select * from sys.redo_size;

VALUE

----------

633224

SQL> select 633224-347024, 347024-56400 from dual;

633224-347024 347024-56400

------------- ------------

286200290624

可以看到在归档模式下,且表的logging属性为true,insert /*+ append */ into这种方式也会纪录大量redo

SQL> alter table redo_test nologging;

Table altered.

SQL> select * from sys.redo_size;

VALUE

----------

635148

SQL> insert into redo_test

2select * from all_objects;

2745 rows created.

SQL> commit;

Commit complete.

SQL> select * from sys.redo_size;

VALUE

----------

918376

SQL> insert /*+ append */ into redo_test select * from all_objects;

2745 rows created.

SQL> commit;

Commit complete.

SQL> select * from sys.redo_size;

VALUE

----------

1207128

SQL> select 918376-635148, 1207128-918376 from dual;

918376-635148 1207128-918376

------------- --------------

283228288752

Archivelog模式下,设置表的logging为false,通过insert /*+ append */ into并不能减少redo.

三下面我们再看一下在归档模式下,几种批量insert操作的效率对比.

redo_test表有45W条记录

SQL> select count(*) from redo_test;

COUNT(*)

----------

452160

1最常见的批量数据加载25秒

SQL> create table insert_normal as

2 select * from redo_test where 0=2;

表已创建。

SQL> set timing on

SQL> insert into insert_normal

2 select * from redo_test;

已创建452160行。

提交完成。已用时间: 00: 00: 25.00

2使用insert /*+ append */ into方式(这个的原理可以参见<>),但纪录redo. 17.07秒SQL> create table insert_hwt

2 as

3 select * from redo_test where 0=2;

表已创建。SQL> insert /*+ append */ into insert_hwt

2 select * from redo_test;

已创建452160行。

提交完成。已用时间: 00: 00: 17.07

3使用insert /*+ append */ into方式,且通过设置表nologging不纪录redo.

SQL> create table insert_hwt_with_nologging nologging

2 as

3 select * from redo_test where 2=0;

表已创建。

/*或者通过alter table table_name nologging设置*/

SQL> insert /*+ append */ into insert_hwt_with_nologging 11.03秒2 select * from redo_test;

已创建452160行。

提交完成。已用时间: 00: 00: 11.03

总结:

我们看到对于批量操作,如果设置表nologging,可以大大提高性能.原因就是Oracle没有纪录DML所产生的redo.当然,这样会影响到备份。nologging加载数据后要做数据库全备.

相关文章:

  • oracle 外链接 加条件,Oracle外连接中对非连接条件使用(+)需要注意的地方
  • oracle通过trc查找死锁sql,从trc查找死锁的有关问题
  • PHP可以实现一对多,微信小程序实现一对多发消息
  • v820w安装linux系统,Linux系统基础-管理之用户、权限管理
  • linux命令seq,Linux 中seq 命令的用法
  • linux图形界面进入etc,怎么从Linux字符界面切换到图形界面
  • 安装了linux启动还是windows,安装完linux后 windows无法启动
  • Linux编译brpc没有输出库,brpc例子编译失败
  • linux环境下压缩文件,经常用到的五种Linux环境中的压缩包命令
  • linux程序库分为,Linux的库
  • 2005年linux手机系统,三系统五大平台 05年22款智能手机横评
  • linux挂起无法唤醒屏幕,linux 出现挂起后无法开启
  • 安徽大学C语言作业4答案,安徽大学C语言实验平台答案
  • linux 7 unzip,CentOS 7实现离线下载
  • c语言中截取字符串 sub,c中substring的用法
  • [NodeJS] 关于Buffer
  • CSS实用技巧干货
  • JavaScript 奇技淫巧
  • maven工程打包jar以及java jar命令的classpath使用
  • Mithril.js 入门介绍
  • MobX
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Nodejs和JavaWeb协助开发
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • sessionStorage和localStorage
  • Vue--数据传输
  • 解析 Webpack中import、require、按需加载的执行过程
  • 排序算法学习笔记
  • 前端
  • 前端面试题总结
  • 巧用 TypeScript (一)
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 问题之ssh中Host key verification failed的解决
  • 想使用 MongoDB ,你应该了解这8个方面!
  • ionic入门之数据绑定显示-1
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​低代码平台的核心价值与优势
  • #pragma预处理命令
  • (07)Hive——窗口函数详解
  • (黑马C++)L06 重载与继承
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (四)汇编语言——简单程序
  • (转) 深度模型优化性能 调参
  • (转)ObjectiveC 深浅拷贝学习
  • (转)菜鸟学数据库(三)——存储过程
  • (转)母版页和相对路径
  • .Net - 类的介绍
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net 知识杂记
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net6Api后台+uniapp导出Excel
  • .net解析传过来的xml_DOM4J解析XML文件
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET应用架构设计:原则、模式与实践 目录预览