Thursday, 9 July 2009

Oracle nologging ไม่สร้าง redo log จริงหรือ

nologging ไม่ได้หมายถึง ไม่มีการสร้าง redo log ในการทำงานทุกอย่างบน object นั้น
nologging จะมีการสร้าง redo log น้อยที่สุดเช่นส่วนของ data dictionary
nologging สามารถทำได้ในระดับ table หรือ tablespace ก็ได้

nologging นั้นจะทำงาน ต้องขึ้นกับบางสถานการณ์เท่านั้น
- DIRECT LOAD (SQL*Loader)
- DIRECT LOAD INSERT (using APPEND hint)
- CREATE TABLE ... AS SELECT
- CREATE INDEX
- ALTER TABLE MOVE
- ALTER TABLE ... MOVE PARTITION
- ALTER TABLE ... SPLIT PARTITION
- ALTER TABLE ... ADD PARTITION (if HASH partition)
- ALTER TABLE ... MERGE PARTITION
- ALTER TABLE ... MODIFY PARTITION, ADD SUBPARTITON, COALESCE SUBPARTITON, REBUILD UNUSABLE INDEXES
- ALTER INDEX ... SPLIT PARTITION
- ALTER INDEX ... REBUILD
- ALTER INDEX ... REBUILD PARTITION

nologging นั้นอาจจะเป็นปัญหากับการ recovery และเป็นปัญหากับ flashback database อย่างแน่นอน (เมื่อ alter table... nologging แล้วทำงานเรียบร้อย ก็ควรจะ alter table... logging)

บางครั้งเราอาจต้องการ insert append หรือ create table และต้องการหลีกเลี่ยงการสร้าง redo log ที่มากๆ
บน database ARCHIVELOG Mode, object นั้นต้องถูกกำหนดเป็น nologging เสียก่อน แต่ใน database NOARCHIVELOG Mode, ไม่ต้องกำหนด nologging ที่ object

ตัวอย่างการสร้าง TABLE:
ขอยกscript ในการเช็ค redo size
Script:

--new.sql
column OLD_VALUE new_value OLD_VALUE
select value OLD_VALUE
from v$mystat, v$statname
where v$mystat.statistic# = v$statname.statistic#
and v$statname.name = 'redo size';

--diff.sql
select (value - &OLD_VALUE) OLD_VALUE
from v$mystat, v$statname
where v$mystat.statistic# = v$statname.statistic#
and v$statname.name = 'redo size';

ARCHIVELOG Mode:
SQL> @begin

OLD_VALUE
----------
0

SQL> create table T_NOLOG nologging as select * from all_objects;

Table created.

SQL> @diff
old 1: select (value - &OLD_VALUE) OLD_VALUE
new 1: select (value - 0) OLD_VALUE

OLD_VALUE
----------
133120

REDO SIZE=133120

SQL> @begin

OLD_VALUE
----------
133120

SQL> create table T_LOG logging as select * from all_objects;

Table created.

SQL> @diff
old 1: select (value - &OLD_VALUE) OLD_VALUE
new 1: select (value - 133120) OLD_VALUE

OLD_VALUE
----------
8748596

REDO SIZE=8748596

จะเห็นว่ามีการสร้าง redo log ที่น้อยมากกับ create table ... nologging

NOARCHIVELOG Mode:

SQL> @begin

OLD_VALUE
----------
0

SQL> create table T_NOLOG nologging as select * from all_objects;

Table created.

SQL> @diff
old 1: select (value - &OLD_VALUE) OLD_VALUE
new 1: select (value - 0) OLD_VALUE

OLD_VALUE
----------
109020

SQL> @begin

OLD_VALUE
----------
109020

SQL> create table T_LOG logging as select * from all_objects;

Table created.

SQL> @diff
old 1: select (value - &OLD_VALUE) OLD_VALUE
new 1: select (value - 109020) OLD_VALUE

OLD_VALUE
----------
106360
ในกรณี no archivelog mode... ไม่จำเป็นต้องระบุว่าเป็น nologging...
insert... as... select ถ้าใช้ nologging เข้ามาช่วย (บวก /*+ append */ ด้วย) ก็อาจทำให้เร็วขึ้น
จะเห็นว่าบางครั้ง nologging อาจะมีประโยชน์...

แต่ทั้งนั้น ทั้งนี้ เราควร alter table... logging และ backup เพื่อไม่ให้เกิดปัญหากับการ recovery

by surachart

0 ความคิดเห็น: