`
javayestome
  • 浏览: 1050756 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Nologging到底何时才能生效?

阅读更多

Nologging到底何时才能生效?

link:

http://www.itpub.net/242761.html

http://www.itpub.net/239905.html

?

我们知道,Nologging只在很少情况下生效
通常,DML操作总是要生成redo的

这个我们不多说.

关于Nologging和append,一直存在很多误解.
经过一系列研究,终于发现了Nologging的真相.

我们来看一下测试:


1.Nologging的设置跟数据库的运行模式有关

a.数据库运行在非归档模式下:


SQL> archive log list;
Database log mode????????????? No Archive Mode
Automatic archival???????????? Enabled
Archive destination??????????? /opt/oracle/oradata/hsjf/archive
Oldest online log sequence???? 155
Current log sequence?????????? 157

SQL> @redo
SQL> create table test as select * from dba_objects where 1=0;

Table created.

SQL> select * from redo_size;

???? VALUE
----------
???? 63392

SQL>
SQL> insert into test select * from dba_objects;

10470 rows created.

SQL> select * from redo_size;

???? VALUE
----------
?? 1150988

SQL>
SQL> insert /*+ append */ into test select * from dba_objects;

10470 rows created.

SQL> select * from redo_size;

???? VALUE
----------
?? 1152368

SQL> select (1152368 -1150988) redo_append,(1150988 -63392) redo from dual;

REDO_APPEND?????? REDO
----------- ----------
?????? 1380??? 1087596

SQL> drop table test;

Table dropped.

我们看到在Noarchivelog模式下,对于常规表的insert append只产生少量redo

b.在归档模式下

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area? 235999908 bytes
Fixed Size?????????????????? 451236 bytes
Variable Size???????????? 201326592 bytes
Database Buffers?????????? 33554432 bytes
Redo Buffers???????????????? 667648 bytes
Database mounted.

SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> @redo
SQL> create table test as select * from dba_objects where 1=0;

Table created.

SQL> select * from redo_size;

???? VALUE
----------
???? 56288

SQL>
SQL> insert into test select * from dba_objects;

10470 rows created.

SQL> select * from redo_size;

???? VALUE
----------
?? 1143948

SQL>
SQL> insert /*+ append */ into test select * from dba_objects;

10470 rows created.

SQL> select * from redo_size;

???? VALUE
----------
?? 2227712

SQL> select (2227712 -1143948) redo_append,(1143948 -56288) redo from dual;

REDO_APPEND?????? REDO
----------- ----------
??? 1083764??? 1087660

SQL> drop table test;

Table dropped.

我们看到在归档模式下,对于常规表的insert append产生和insert同样的redo
此时的insert append实际上并不会有性能提高.
但是此时的append是生效了的

通过Logmnr分析日志得到以下结果:

SQL> select operation,count(*)
? 2? from v$logmnr_contents
? 3? group by operation;

OPERATION????????????????????????? COUNT(*)
-------------------------------- ----------
COMMIT?????????????????????????????????? 17
DIRECT INSERT???????????????????????? 10470??
INTERNAL???????????????????????????????? 49
START??????????????????????????????????? 17
????????????????????????????????????????? 1
?????????????????????????????????????????
我们注意到这里是DIRECT INSERT,而且是10470条记录,也就是每条记录都记录了redo.


2.对于Nologging的table的处理

a. 在归档模式下:
SQL> create table test nologging as select * from dba_objects where 1=0;

Table created.

SQL> select * from redo_size;

???? VALUE
----------
?? 2270284

SQL>
SQL> insert into test select * from dba_objects;

10470 rows created.

SQL> select * from redo_size;

???? VALUE
----------
?? 3357644

SQL>
SQL> insert /*+ append */ into test select * from dba_objects;

10470 rows created.

SQL> select * from redo_size;

???? VALUE
----------
?? 3359024

SQL> select (3359024 -3357644) redo_append,(3357644 - 2270284) redo from dual;

REDO_APPEND?????? REDO
----------- ----------
?????? 1380??? 1087360

SQL> drop table test;

Table dropped.

我们注意到,只有append才能减少redo


b.在非归档模式下:

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area? 235999908 bytes
Fixed Size?????????????????? 451236 bytes
Variable Size???????????? 201326592 bytes
Database Buffers?????????? 33554432 bytes
Redo Buffers???????????????? 667648 bytes
Database mounted.
SQL> alter database noarchivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> @redo
SQL> create table test nologging as select * from dba_objects where 1=0;

Table created.

SQL> select * from redo_size;

???? VALUE
----------
???? 56580

SQL>
SQL> insert into test select * from dba_objects;

10470 rows created.

SQL> select * from redo_size;

???? VALUE
----------
?? 1144148

SQL>
SQL> insert /*+ append */ into test select * from dba_objects;

10470 rows created.

SQL> select * from redo_size;

???? VALUE
----------
?? 1145528

SQL> select (1145528 -1144148) redo_append,(1144148 -56580) redo from dual;

REDO_APPEND?????? REDO
----------- ----------
?????? 1380??? 1087568

SQL>??????????????????????????????????????????

同样只有append才能减少redo的生成.

这就是通常大家认识的情况.?????????????????????????????????????????

分享到:
评论

相关推荐

    oracle nologging 总结

    oracle nologging全面总结,从数据库级别,对象以及表级别都有说明,以及在生产环境的影响,和及时止损的处理方法。

    profile和bashrc比较测试.

    profile和bashrc比较测试, 结论:bashrc文件可以在nologging状态下生效,而profile文件不可以

    abator 生成ibaties dao xml

    6. **整合到项目中**: 生成的 DAO 类和 XML 文件需要被添加到项目的构建路径中,并且在 MyBatis 的核心配置文件中引入这些 XML 文件,这样 MyBatis 才能在运行时找到并执行相关的 SQL 语句。 7. **自定义模板**: ...

    Append原理Append原理

    在归档下nologging表或者在非归档下nologging表,只要append,undo、redo都很少生成或者不生成。 实验结果表明,在非归档模式下,使用Append操作可以大大减少redo的生成量。同时,在使用Append操作时,undo的生成量...

    oracle 8795792补丁

    在数据库管理过程中,遇到错误代码如ORA-14102时,这通常意味着在执行某些操作,如创建表或分区时,尝试同时指定"LOGGING"和"NOLOGGING"选项,这是不被允许的。Oracle数据库系统只允许在一个语句中明确地设置其中一...

    Oracle_tablespace_(表空间)的创建、删除、修改、扩展及检查等

    在创建表空间时,可以选择 logging 或 nologging 模式,logging 模式将创建重做日志,而 nologging 模式不创建重做日志。通常情况下,在创建表空间时,选择 nologging 模式,以加快表空间的创建速度。 在创建表空间...

    oracle海量数据中提升创建索引的速度.docx

    nologging 参数可以禁止 redo 日志的生成,从而提高创建索引的速度。redo 日志是 Oracle 数据库中用于记录所有变化的日志,包括数据的插入、更新和删除等操作。在创建索引时,redo 日志会记录所有的操作,这将减慢...

    Oracle表的类型及定义[归类].pdf

    PCTUSED则定义何时将块放回freelist。 - **INITIAL, NEXT, PCTINCREASE**:定义段的扩展策略,但在局部管理表空间中,通常设置INITIAL=NEXT,PCTINCREASE=0,以避免碎片。 - **MINEXTENTS 和 MAXEXTENTS**:控制...

    一个Oracle建表SQL语句的优化.pdf

    同时,也应当考虑使用Nologging选项来进一步提高操作速度,但要注意它对数据恢复可能产生的不利影响。最后,通过查看并分析执行计划,可以更深入地理解不同SQL语句在性能上的差异,进而选择出最适合特定情况的建表...

    某省移动核心数据库迁移方案.docx

    数据库层面准备包括清理/区分无用的表、整理出可以不停应用、预先迁移的历史、静态表、整理出需要停应用才能迁移的其它表、整理出第二阶段迁移的表的索引以及约束的 ddl,并修改 nologging 以及并行属性。...

    Oracle创建表空间详解

    其中,`tablespace_name`是你想要创建的表空间的名称,`file_path`指定数据文件的物理路径和文件名,`size`定义了初始大小,而`AUTOEXTEND`、`MAXSIZE`、`LOGGING`/`NOLOGGING`、`EXTENT MANAGEMENT`和`SEGMENT ...

    原厂数据库规范PPT学习教案.pptx

    - `initrans`的使用原则:每个`initrans`占用24Bytes空间,不可超过10,且修改后仅对新数据块生效,需要全表调整时需重新组织表。 - `freelists`参数在ASSM表空间上不需设置。 3. **列设计规范**: - 使用`CHAR`...

    oracle FORCE LOGGING.txt

    3. **对象级别**:如果设置了 NOLOGGING,则该对象的操作不会被记录。 #### 六、Force Logging 与 Non-Force Logging 的转换 1. **从非 Force Logging 转换到 Force Logging**: ```sql ALTER DATABASE FORCE ...

    mybatis源码中文注释.zip

    org.apache.ibatis.logging.nologging org.apache.ibatis.logging.slf4j org.apache.ibatis.logging.stdout 对象适配器设计模式 2.异常 org.apache.ibatis.exceptions 3.缓存 org.apache.ibatis.cache org.apache...

    Data Guard配置

    1. 启动主数据库的强制日志记录功能,避免Nologging子句的影响 ALTER DATABASE FORCE LOGGING; 2. 配置日志传递的安全认证 一般情况,设定remote_login_passwordfile=exclusive,并且配置tnsnames.ora即可 3. 配置主...

    Oracle原厂数据库规范.ppt

    但需要注意,initrans每个槽占用24Bytes空间,且不可超过10,同时initrans的修改只对新数据块生效。 3. **列设计**: - 使用`CHAR`类型表示定长字符,`VARCHAR2`表示不定长字符,以提高查询效率。`CHAR`类型会用...

    Oracle数据库规范

    - 创建或重建大型索引时,需要指定NOLOGGING子句、并行度以及较大的排序区,以提高执行效率。 - 将差异最大的列放在索引的最前端。 - 对于OLTP应用的业务系统,索引数据的重复率不应超过20%。 - 当需要按照某列...

    Oracle数据库操作实例讲解定义.pdf

    文本格式的参数文件可以直接用文本编辑器修改,但修改后必须重启数据库以使更改生效。对于二进制格式,应使用`ALTER SYSTEM` SQL语句进行动态或静态参数的修改。此外,Oracle企业管理器(EM console)提供图形化的...

Global site tag (gtag.js) - Google Analytics