DISABLE LOGGING

目次

基本情報

パラメータ

 

Syntax  : _DISABLE_LOGGING
Default : FALSE
設定方法 : ・Parameter File
      ・ALTER SYSTEM SET “_DISABLE_LOGGING” = FALSE
サポート : ほとんどのバージョン

 

説明

 

Redo Bufferの内容をRedo Logに記録するかどうかを指定します。もしFALSEに値を指定すると、記録が行われません。Import作業がDirect Load操作のパフォーマンスを向上させるために使用されている場合があります。しかし、データ整合性と回復(Recovery)に影響を与えることができるので、お勧めしません。

注意

 

パラメータの限界

 

_DISABLE_LOGGINGパラメータはRedo Logに記録されている作業だけ制御します。値をFALSEに指定しても、次のような作業はまだ行われます。

 ・Redo Recordの作成

 ・Redo Bufferの記録

 ・Log SwitchによるCheckpoint作業

つまり、Redo Logに記録する実際のI/O操作だけが行われないだけで、その他のRedoに関連するすべての作業はすべて行われます。したがってRedo Bufferのサイズが大きい場合に特に有利となります。Redo Bufferのサイズが大きければそれだけLog Switchの発生が減少しCheckpointが行われないからです。

Import/ Direct Loadとの関係

大量のデータをロードする場合_DISABLE_LOGGINGパラメータを使用することなく、Direct Loadを使用することが望ましい方法です。Direct Loadを使用している場合、Redoデータの記録をしていないため、パフォーマンスを劇的に向上させることができます。

Direct Loadを使用することができない一般的なImportの場合には、_DISABLE_LOGGINGパラメータが助けになります。しかし、この場合でも、最後の方法として残しておくのがよい方法です。使用可能な方法は、以下の通りです。

 ・Commit頻度を減少させる。つまり可能な複数のユニットをまとめてCommitを実行します。

 ・Indexを削除した状態で、Loadingを実行します。Loadingが終了したら、インデックスをNologgingモードで再生成します。

 ・COMMIT_WRITEパラメータを使用する。

_DISABLE_LOGGINGテスト

-- @redo.sql
SELECT name, value FROM v$sysstat 
     WHERE name in ('redo size', 'redo writes', 'redo blocks written');
-- @generate_redo.sql
BEGIN
    FOR idx IN 1 .. 1000 LOOP
       INSERT INTO redo_test VALUES(idx);
       COMMIT;
    END LOOP;
END;
/

<-- Case1: _DISABLE_LOGGING = FALSE
SQL> @redo
NAME                                                                  VALUE
---------------------------------------------------------- ----------
redo size                                                             132694312
redo writes                                                          42438
redo blocks written                                               299858

SQL> @generate_redo

NAME                                                                  VALUE
---------------------------------------------------------- ----------
redo size                                                             135248264
redo writes                                                          47353
redo blocks written                                               311326

-- 생성된 Redo 데이터는 다음과 같다.
redo size = 135248264 - 132694312 = 2553952
redo bytes = 47353 - 42438 = 4915
redo blocks written = 311326 - 299858 = 11468

-- Case2: _DISABLE_LOGGING = TRUE
SQL> @redo
NAME                                                                  VALUE
---------------------------------------------------------- ----------
redo size                                                             135248264
redo writes                                                          47353
redo blocks written                                               311326

SQL> @generate_redo
  
NAME                                                                  VALUE
---------------------------------------------------------- ----------
redo size                                                             137732296
redo writes                                                          50760
redo blocks written                                               317759

-- 생성된 Redo 데이터는 다음과 같다.
redo size = 137732296-135248264 = 2484032
redo writes = 50760 - 47353 = 3407
redo blocks written = 317759 - 311326 = 6433

上記の二つの結果を比較してみると、_DISABLE_LOGGINGがTRUEである場合には、redo sizeとredo writesはほとんど似ていますが、redo blocks written値が著しく小さいことが確認できます。このテストの結果は、Redoデータを生成して記録する作業自体は同じですが、「実際にディスクに記録」する作業だけで違いがあることを示しています。

関連情報

 

1. COMMIT_WRITEパラメータ

2. _WAIT_FOR_SYNCパラメータ