-
1:ID:Rzlq6q · 2017-11-17

#質問 Oracleデータベース初心者です。Oracleでは、DML文を実行すると、REDOログバッファ(メモリ)に更新情報が書き込まれ、CommitするとREDOログファイル(ディスク)に書き込まれる。REDOログファイルが一杯になると、今度はデータファイルに書き込まれる、という風に認識しています。
ここで疑問なのですが、REDOログファイルがデータファイルに書き込まれるまでの間は、当然データファイルには更新情報が無いわけですよね。そのタイミングでSELECT文が実行された場合、内部的にはデータファイルとREDOログファイルの双方を見に行っているんでしょうか?

7 件の回答

2:ID: · 2017-11-17

自分で調べてて思ったのですが、データベースバッファキャッシュを参照しているのでしょうか?

4:ID:uo7fie · 2017-11-19

SELECTを投げた瞬間にREDOの内容はすべてデータに反映される。SELECTが実行されるのはその後なので、内部的には「更新されたデータファイル」を見に行ってる。

この辺は、StaticsでRedoSizeを調べるとか、SQLをトレースすれば、どういう挙動をしているのか分かるので、勉強になるので見ておくといい。そこでデータベースの面白さが分かったら「データベース初心者」は卒業だ。頑張れ。

5:ID:uo7fie · 2017-11-19

Re:4
Staticsって何だ。Statisticsだ。すまぬ。

6:ID:5.u7jA · 2017-11-19

Re:4
ありがとうございます。StatisticsとREDOSIZE、ググる&見てみます。
select前にデータへ反映される=オンラインREDOログファイルの情報がデータファイルに書き込まれる。ということでしょうか?その時、アーカイブREDOログファイルへも書き込まれるんでしょうか?
そうだとするとディスク書き込みが頻発して効率悪そうだな、という印象をうけました質問ばかりですいません

7:ID:uo7fie · 2017-11-19

Re:6
アーカイブREDOにも当然書き込まれる。そうじゃないとロールフォワードに対応できなくなる。あと、ディスク書き込みが頻発するのを防ぐために、頻繁にSELECTが実行される場合、SELECT自体をREDOに書き込んで、あとはCommitが行われるまで、そのSELECTは待ちになる。

待ちが発生するのは非効率に見えるが、その頻度も10000回のリクエストをほぼ同時に、とかそんなんなので、待ちが発生するタイミングはあまりないし、そうなったらデータベースの「外」の仕組みを変える(例えばWebならWbeキャッシュサーバを置く)とか、データベース用のサーバのスペックを上げるとか考えないといけない。

8:ID:9ADCwz · 2017-11-19

Re:7
想像しているよりも書き込みが速いということですね。ありがとうございました。

1 件の回答が除外されました。[詳細]
コメントの受付は終了しました。

一緒に読まれている質問

ページ上部に戻る