- PR -

Oracle8.0.5 REDOログについて

投稿者投稿内容
さらのとうちゃん
会議室デビュー日: 2005/04/07
投稿数: 11
投稿日時: 2005-04-07 16:17
はじめまして。

現在、Oracle8.0.5のREDOログについて悩んでおります。

環境
【Server】
OS:WindowsNT
DB:Oracle8.0.5

【Client】
OS:Windows98


VB6SP3にてシステム構築している保守をしています。

本題に入りますが、
あるプログラムを使用するとREDOログがかなり使用されます。

プログラムに原因があるのかOracleの設定に原因があるのかを
調査しています。

画面でデータを更新・追加・削除できるのですが、
2レコード更新しするだけで、
REDOログの使用量が12Mが使用されます。

画面から夜間バッチで使用しているバッチも実行されています。

試しに夜間バッチのREDOログ使用量を調査してみましたが
2M程度でした。

TRACE等とったりして、
調査しているのですが、わからなくなってきました。

おかしいと思う点は画面のプログラムの
トランザクションの張り方です。

トランザクションの張り方によって、
REDOログの使用量がかわるのでしょうか?

ご教授・アドバイス・ご指摘など
何でも結構ですので、
よろしくお願いします。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2005-04-07 16:25
今日は。

引用:

トランザクションの張り方によって、
REDOログの使用量がかわるのでしょうか?


知ってると思いますが、REDOはデータベースに加えられた変更を戻せる様に
する為の物です。
なので、トランザクションの張り方と言うよりは
トランザクションを実行する事によってどういうデータが変更されているのか?
の理解が必要です。

たとえば主キー、外部キーとかで複数のテーブルが結合されていて
かつ1カ所更新したら関連するデータ全て更新する様になっていれば
当然それに対する変更も記録されますよね? 

と言う事でテーブルがどうなっていて、そのトランザクションを実行する事によって
どういうデータが更新されるのかを把握した方が良いかと 
さらのとうちゃん
会議室デビュー日: 2005/04/07
投稿数: 11
投稿日時: 2005-04-07 17:34
引用:

NAOさんの書き込み (2005-04-07 16:25) より:
今日は。

引用:

トランザクションの張り方によって、
REDOログの使用量がかわるのでしょうか?


知ってると思いますが、REDOはデータベースに加えられた変更を戻せる様に
する為の物です。
なので、トランザクションの張り方と言うよりは
トランザクションを実行する事によってどういうデータが変更されているのか?
の理解が必要です。

たとえば主キー、外部キーとかで複数のテーブルが結合されていて
かつ1カ所更新したら関連するデータ全て更新する様になっていれば
当然それに対する変更も記録されますよね? 

と言う事でテーブルがどうなっていて、そのトランザクションを実行する事によって
どういうデータが更新されるのかを把握した方が良いかと 




ご回答ありがとうございます。
テーブルの更新量はあきらかに
夜間バッチの方がおおいです。
(更新する内容も同じようなものです。)

夜間バッチの方はトランザクションのをこまめに切って
コミットしてるいのですが、

問題の画面ですが、
例ですが、

BeginTran
''バックアップテーブル
CreateTable xxx1
''テンポラリテーブル
CreateTable xxx2
''既存テーブルをバックアップテーブルに複写
Insert into xxx1 select * from aaa1

更新処理1 → 更新内容をxxx2テーブルにInert

commit

BeginTran

更新処理2 → 夜間バッチで使用しているバッチ呼び出し

DropTable xxx1
DropTable xxx2

commit

みたいな感じなのです。

Naoさんがおっしゃている内容ですと
トランザクションの長さではREDOログの使用量はかわらないと
言うことでしょうか?

補足ですが、
テーブルは確認しましたが、
結合とかの怪しい点はありませんでした。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2005-04-07 17:48
今晩は。

引用:

BeginTran
''バックアップテーブル
〜中略〜
commit



要は同じテーブル作ってコピーして更新する内容を追加してるんですよね?
Oracleがどう扱ってるかは解りませんが、12Mも増えるって事は
1行ずつコピーをしてる様な気がします。

引用:

BeginTran

更新処理2 → 夜間バッチで使用しているバッチ呼び出し

DropTable xxx1
DropTable xxx2


更新処理2が何をやってるか解りませんので、その辺りを
調べれば良いかと。

引用:

トランザクションの長さではREDOログの使用量はかわらないと
言うことでしょうか?


質問の通りトランザクションの長さでは無く、REDOは
更新されるデータ量(というか何か起きた時にROLLBACKする処理量)
で変わります。
いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 2005-04-07 17:50
引用:

問題の画面ですが、
例ですが、

BeginTran
''バックアップテーブル
CreateTable xxx1
''テンポラリテーブル
CreateTable xxx2
''既存テーブルをバックアップテーブルに複写
Insert into xxx1 select * from aaa1

更新処理1 → 更新内容をxxx2テーブルにInert

commit

BeginTran

更新処理2 → 夜間バッチで使用しているバッチ呼び出し

DropTable xxx1
DropTable xxx2

commit

みたいな感じなのです。


これが画面側で行っている処理なら、明らかに昼の方がデータ更新量が多いのでは?
さらのとうちゃん
会議室デビュー日: 2005/04/07
投稿数: 11
投稿日時: 2005-04-07 18:15
Naoさん、いーたさんありがとうございます。

説明不足で申し訳ありません。

詳しく説明しますと、
日次夜間バッチで実績データを取込ます。
(毎日1000レコードくらいです。)

画面はその実績に修正があった場合に使用します。

更新処理1は
画面で修正した内容をxxx2テーブルにInsertします。

更新処理2は
夜間バッチで使用している一部のプログラムを
使用しテーブルにUpdate、Insert、Deleteを行う。

はじめのバックアップテーブルにコピーするのは
修正対象のレコードだけです。

そのバックバックアップで12Mになっているのかどうかまではわかりません。

トレースをとってみたのですが、

SELECT * FROM aaa1 FOR UPDATE NOWAIT

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 5 0.00 0.19 0 0 0 0
Execute 5 2.21 7.70 0 1270 69173 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 10 2.21 7.89 0 1270 69173 0

のCURRENT「69173」が以上に多いような気がしました。

夜間バッチではこんなになっているところはありませんでした。

トレース結果を記載しておきます。
画面での更新のトレースの統計
画面のトレース統計
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse       28      0.16       1.39          0          0          4           0
Execute     30      2.52      13.28          0       1285      69250          13
Fetch        6      0.02       0.01          0         72          6           4
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       64      2.70      14.68          0       1357      69260          17

Misses in library cache during parse: 12


OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse      204      0.40       6.52          0          0          1           0
Execute    322      0.18       1.77          0        604       1543         327
Fetch       77      0.02       0.01          0        186          0          25
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      603      0.60       8.30          0        790       1544         352

バッチ処理での統計
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse       61      0.43       3.47          0          0          6           0
Execute     69      0.70       7.35          4          3        117           5
Fetch       63      0.01       0.05          2       2463         30         101
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      193      1.14      10.87          6       2466        153         106

Misses in library cache during parse: 21


OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse      322      1.03      13.76          1          0          3           0
Execute    527      0.31       2.31          0        594       1343         286
Fetch      805      0.03       0.06          2       1560          3         592
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total     1654      1.37      16.13          3       2154       1349         878

>更新処理2が何をやってるか解りませんので、その辺りを
>調べれば良いかと。
調査しましたが、更新処理2ではないようです。


説明不足かもしれませんがよろしくお願いします。

[ メッセージ編集済み 編集者: さらのとうちゃん 編集日時 2005-04-07 18:18 ]
いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 2005-04-08 00:31
引用:

はじめのバックアップテーブルにコピーするのは
修正対象のレコードだけです。

そのバックバックアップで12Mになっているのかどうかまではわかりません。


aaa1テーブルの全件をxxx1テーブルにINSERTしているので、aaa1テーブルのレコード総件数がわかればおおよそのサイズがわかるのではないでしょうか?

引用:

>更新処理2が何をやってるか解りませんので、その辺りを
>調べれば良いかと。
調査しましたが、更新処理2ではないようです。


UPDATE/INSERT/DELETEを行っていればREDOログが生成されるので関係あると思います。
こちらについても該当する件数がわからないでしょうか?
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2005-04-08 02:42
引用:

NAOさんの書き込み (2005-04-07 17:48) より:
質問の通りトランザクションの長さでは無く、REDOは
更新されるデータ量(というか何か起きた時にROLLBACKする処理量)
で変わります。



もうちょい正確に言うと、更新されるデータ量(というか何か起きた時にROLLFORWARD&ROLLBACKする処理量)で変わります。

スキルアップ/キャリアアップ(JOB@IT)