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全面总结,从数据库级别,对象以及表级别都有说明,以及在生产环境的影响,和及时止损的处理方法。
profile和bashrc比较测试, 结论:bashrc文件可以在nologging状态下生效,而profile文件不可以
6. **整合到项目中**: 生成的 DAO 类和 XML 文件需要被添加到项目的构建路径中,并且在 MyBatis 的核心配置文件中引入这些 XML 文件,这样 MyBatis 才能在运行时找到并执行相关的 SQL 语句。 7. **自定义模板**: ...
在归档下nologging表或者在非归档下nologging表,只要append,undo、redo都很少生成或者不生成。 实验结果表明,在非归档模式下,使用Append操作可以大大减少redo的生成量。同时,在使用Append操作时,undo的生成量...
在数据库管理过程中,遇到错误代码如ORA-14102时,这通常意味着在执行某些操作,如创建表或分区时,尝试同时指定"LOGGING"和"NOLOGGING"选项,这是不被允许的。Oracle数据库系统只允许在一个语句中明确地设置其中一...
在创建表空间时,可以选择 logging 或 nologging 模式,logging 模式将创建重做日志,而 nologging 模式不创建重做日志。通常情况下,在创建表空间时,选择 nologging 模式,以加快表空间的创建速度。 在创建表空间...
nologging 参数可以禁止 redo 日志的生成,从而提高创建索引的速度。redo 日志是 Oracle 数据库中用于记录所有变化的日志,包括数据的插入、更新和删除等操作。在创建索引时,redo 日志会记录所有的操作,这将减慢...
PCTUSED则定义何时将块放回freelist。 - **INITIAL, NEXT, PCTINCREASE**:定义段的扩展策略,但在局部管理表空间中,通常设置INITIAL=NEXT,PCTINCREASE=0,以避免碎片。 - **MINEXTENTS 和 MAXEXTENTS**:控制...
同时,也应当考虑使用Nologging选项来进一步提高操作速度,但要注意它对数据恢复可能产生的不利影响。最后,通过查看并分析执行计划,可以更深入地理解不同SQL语句在性能上的差异,进而选择出最适合特定情况的建表...
数据库层面准备包括清理/区分无用的表、整理出可以不停应用、预先迁移的历史、静态表、整理出需要停应用才能迁移的其它表、整理出第二阶段迁移的表的索引以及约束的 ddl,并修改 nologging 以及并行属性。...
其中,`tablespace_name`是你想要创建的表空间的名称,`file_path`指定数据文件的物理路径和文件名,`size`定义了初始大小,而`AUTOEXTEND`、`MAXSIZE`、`LOGGING`/`NOLOGGING`、`EXTENT MANAGEMENT`和`SEGMENT ...
- `initrans`的使用原则:每个`initrans`占用24Bytes空间,不可超过10,且修改后仅对新数据块生效,需要全表调整时需重新组织表。 - `freelists`参数在ASSM表空间上不需设置。 3. **列设计规范**: - 使用`CHAR`...
3. **对象级别**:如果设置了 NOLOGGING,则该对象的操作不会被记录。 #### 六、Force Logging 与 Non-Force Logging 的转换 1. **从非 Force Logging 转换到 Force Logging**: ```sql ALTER DATABASE FORCE ...
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...
1. 启动主数据库的强制日志记录功能,避免Nologging子句的影响 ALTER DATABASE FORCE LOGGING; 2. 配置日志传递的安全认证 一般情况,设定remote_login_passwordfile=exclusive,并且配置tnsnames.ora即可 3. 配置主...
但需要注意,initrans每个槽占用24Bytes空间,且不可超过10,同时initrans的修改只对新数据块生效。 3. **列设计**: - 使用`CHAR`类型表示定长字符,`VARCHAR2`表示不定长字符,以提高查询效率。`CHAR`类型会用...
- 创建或重建大型索引时,需要指定NOLOGGING子句、并行度以及较大的排序区,以提高执行效率。 - 将差异最大的列放在索引的最前端。 - 对于OLTP应用的业务系统,索引数据的重复率不应超过20%。 - 当需要按照某列...
文本格式的参数文件可以直接用文本编辑器修改,但修改后必须重启数据库以使更改生效。对于二进制格式,应使用`ALTER SYSTEM` SQL语句进行动态或静态参数的修改。此外,Oracle企业管理器(EM console)提供图形化的...