对比append插入数据产生的redo量

--版本信息
SELECT * FROM v$version;
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Prod
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0    Production
TNS for 32-bit Windows: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production

--查看是否归档
select name,log_mode from v$database;
1    ORCL NOARCHIVELOG
或sqlplus:ARCHIVE LOG LIST;

--创建查看产生redo大小的视图
create or replace view redo_size as
select value
from v$mystat, v$statname
where v$mystat.statistic# = v$statname.statistic#
and v$statname.name = ‘redo size‘;

1.在非归档模式下

--!!!!!!!!!!!非归档模式 产生的redo!!!!!!!!!!!!!!!!!!
--==============nologging表================
SELECT * FROM sys.redo_size;
--redo_size:0
create table test_nolog nologging as select * from dba_objects where 1=0;
--redo_size:17932
insert into test_nolog select * from dba_objects;
--redo_size:5772780
insert /*+ APPEND */  into test_nolog select * from dba_objects;
--redo_size:5782548
select (5782548-5772780) redo_append, (5772780-17932) redo_normal from dual;
9768    5754848
--================logging============================
--redo_size:11778596
create table test_log as select * from dba_objects where 1=0;
--redo_size:11799284
insert into test_log select * from dba_objects;
--redo_size:17555812
insert /*+ APPEND */  into test_log select * from dba_objects;
--redo_size:17565544
select (17565544-17555812) redo_append, (17555812-11799284) redo_normal from dual;
9732    5756528

结论:非归档模式下,只需append就能大量减少redo的产生,如果不加append,即使是nologing表也会产生一样多的redo;

2.在归档模式下

--修改为归档模式
set ORACLE_SID=ORCL
sqlplus / as sysdba

SYS@ORCL> archive log list
数据库日志模式             非存档模式
自动存档             禁用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     544
当前日志序列           546
SYS@ORCL> select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG

SYS@ORCL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SYS@ORCL> startup mount
ORACLE 例程已经启动。

Total System Global Area 1258291200 bytes
Fixed Size                  1304848 bytes
Variable Size             201328368 bytes
Database Buffers         1048576000 bytes
Redo Buffers                7081984 bytes
数据库装载完毕。
SYS@ORCL> alter database ARCHIVELOG;

数据库已更改。
SYS@ORCL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     544
下一个存档日志序列   546
当前日志序列           546
SYS@ORCL> alter database open;

数据库已更改。
--!!!!!!!!!!!归档模式 产生的redo!!!!!!!!!!!!!!!!!!
--==============nologging表================
SELECT * FROM redo_size;
--redo_size:0
insert into test_nolog select * from dba_objects;
--redo_size:5729772
insert /*+ APPEND */  into test_nolog select * from dba_objects;
--redo_size:5739436
select (5739436-5729772) redo_append, (5729772-0) redo_normal from dual;
9664  5729772
--================loging============================
--redo_size:5729772
insert into test_log select * from dba_objects;
--redo_size:11355620
insert /*+ APPEND */  into test_log select * from dba_objects;
--redo_size:17123736
select (17123736-11355620) redo_append, (11355620-5729772) redo_normal from dual;
5768116  5625848

结论:归档模式下,append并且表为nologging 才能减少redo的产生,其余情况没效果;

时间: 2024-11-01 09:17:13

对比append插入数据产生的redo量的相关文章

Oracle 插入数据效率对比

oracle插入数据有多种方式: 将从多个表中查出来的数据插入到临时表中 数据行数 5189597 1.传统方式:直接将数据插入到表中 1 insert into LLB_BASIC_USER_D_TEMP_TEST 2 select t.serv_id, 3 t.phone_id, 4 a1.loc_imei t, 5 region_code, 6 t.county_code, 7 t.payment_mode_cd, 8 t.plan_id, 9 t.productflux, 10 t.al

LinkedList插入数据效率不一定比ArrayList高,源码分析+实验对比

(一)结论 在尾部插入数据,数据量较小时LinkedList比较快,因为ArrayList要频繁扩容,当数据量大时ArrayList比较快,因为ArrayList扩容是当前容量*1.5,大容量扩容一次就能提供很多空间,当ArrayList不需扩容时效率明显比LinkedList高,因为直接数组元素赋值不需new Node 在首部插入数据,LinkedList较快,因为LinkedList遍历插入位置花费时间很小,而ArrayList需要将原数组所有元素进行一次System.arraycopy 插

Android批量插入数据效率对比

1.一个一个插入 /** * 向表中插入数据 * * @param openHelper * @param appInfo * @return */ public static boolean insert(SQLiteOpenHelper openHelper, RemoteAppInfo appInfo) { if (null == appInfo) { return true; } SQLiteDatabase db = null; try { db = openHelper.getWri

C#_批量插入数据到Sqlserver中的四种方式

先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database CarSYS;    go    use CarSYS;  

MySQL批量插入数据的几种方法

最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; public class TestBigData { /**

批量插入数据(基于Mybatis的实现-Oracle)

前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. ---------------------------------------------------------------------------- 批量插入数据方式: 一.Mybatis 全局设置批处理: 二.Mybatis 局部设置批处理: 三.Mybatis foreach批量插入: ①SELECT UNION ALL: ②BEGIN INSERT I

Django 批量插入数据、自定义分页器、多表关系的建立及Form组件(待更新。。。)

目  录 django批量出入数据 自定义分页器 创建多对多表关系的建立 form组件 form组件钩子函数 一.django批量出入数据 视图函数: from app01 import models # 向表中插入1000条数据 def index(request): # 方式1: # for i in range(1000): # models.Book.objects.create(title='第%s本书'%i) # book_Queryset = models.Book.objects

Django 批量插入数据

项目需求:浏览器中访问django后端某一条url(如:127.0.0.1:8080/get_book/),实时朝数据库中生成一千条数据并将生成的数据查询出来,并展示到前端页面 views.py from django.shortcuts import render, HttpResponse, redirect from app01 import models def get_book(request): # for循环插入1000条数据 for i in range(1000): model

没有躲过的坑--map的初始化(插入数据)

最近工作中需要使用map,进行查询. 首先简单介绍一点map,也许是教科书里讲授最少的STL知识吧.但是在实际工作中map挺重要的,用于查找很方便快捷,尤其是以键和值的形式存在的! 1.头文件 #include<map> 2.map的功能 自动建立Key - value的对应.key 和 value可以是任意你需要的类型. 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次. 快速插入Key - Value