こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

統計情報の取得=コミットですか?

いつもお世話になっております。
あるシステムの処理で

大量データ挿入⇒統計情報の取得⇒挿入したデータを基にファイル作成

という処理を行っております。
ファイル作成時に失敗した際に、ロールバック処理を行うように
設定しているのですが、既にデータが挿入されてしまっています。

初心者でいまいち統計情報の取得が良く分かっていないのですが、
統計情報を取得するSQL文を流した時点でトランザクションは
コミットされるのでしょうか?

よろしくお願い致します。

投稿日時 - 2008-12-02 11:58:21

QNo.4523649

すぐに回答ほしいです

質問者が選んだベストアンサー

 10gのマニュアルを確認すると、DBMS_STATSパッケージの解説に次のような一句があります。
 「このパッケージのほとんどのプロシージャは、現行のトランザクションをコミットし、操作を実行してから再度コミットします。 」
 というわけで、統計情報収集のロールバックはできないようですね。

投稿日時 - 2008-12-02 22:23:04

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

質問からの先読みとなりますが、
統計収集パッケージを実行するとコミットされてしまうようなので不可、
となりますと、動的サンプリングを使うと良いかもしれません。

動的サンプリングとは、SQLを実行する瞬間に表の統計情報を取得するやり方で、SQLのヒント句もしくは、DBの、OPTIMIZER_DYNAMIC_SAMPLINGパラメータで動作を制御できます。

具体的には、

大量データ挿入⇒挿入したデータを基にファイル作成(動的サンプリングヒント句つき)

で対処できるのではないかと思います。

詳しい使用方法は、Oracleパフォーマンスチューニングガイドや、各種Oracle系情報サイトなどで調べてみてください。
<10gドキュメントのリンク>
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/index.htm

投稿日時 - 2008-12-06 11:13:38

ANo.3

試してみました。

(1)セッション1でempをアップデート
(2)セッション2でempをSelect
※commit前のデータを参照。
(3)セッション1でempをアナライズ
(4)セッション1でempをSelect
※Updateしたデータを参照。
(5)セッション2でempをSelect
※Updateしたデータを参照。
(6)セッション1でRollback
(7)セッション1でempをSelect
※Updateしたデータを参照。
(8)セッション2でempをSelect
※Updateしたデータを参照。

どうやら暗黙Commitがかかっているようです。
DDLを投げると暗黙Commitが流れるのは当たり前のことですが、よく考えてみるとAnalyzeもDDL扱いなので動きとしては納得できます。

投稿日時 - 2008-12-02 16:50:28

ANo.2

トランザクションを開始した時点で、そのトランザクション独自の
世界ができると思ってください。そこで挿入、更新、削除するのは
自由です。INSERT直後にデータを読み込むことも出来ますし、更新も
反映されています。但し、その世界ではの話です。
この時、外の(別の)世界の住人から見ると、DBは全く更新されて
いません。トランザクションをコミットすると、独自の世界の話が
実DBに反映され、外の世界からも同じ情報が見えるようになります。
ロールバックは独自世界の各種更新を無かったことにします。
もし、独自世界の統計では意味が無いというのであれば、コミット後に
統計を取るように手順を変更します。

投稿日時 - 2008-12-02 15:57:43

補足

何度もご回答ありがとうございます。
質問の主旨が伝わっていないようなので、再度補足させていただきます。
説明不足で申し訳ありません。

大量データ挿入⇒統計情報の取得⇒挿入したデータを基にファイル作成

の、ファイル作成(同一トランザクション内)に失敗した場合、ロールバック処理が動くようになっています。
ログを見てみるとロールバックをされているようなのですが、
データが確定されてしまっています。

統計情報の取得をしてしまうと、同一トランザクション内でもロールバックは出来ないのでしょうか?

投稿日時 - 2008-12-02 16:03:34

ANo.1

同一トランザクションだからでは?
同一トランザクション内のDB更新は反映され、「挿入」したデータが
見えます。しかし、コミットするまでは他のトランザクションや、
プロセスからは「挿入」したデータが見えません。
ファイル作成前にツールなどで、DBを覗いて見ると、「挿入」した
データは存在しないはず。

投稿日時 - 2008-12-02 13:36:13

補足

同一トランザクションです。
同一トランザクションで、データを挿入して統計情報を取得してしまうと、
ロールバックしてもデータは戻らないという事でよろしいでしょうか?

投稿日時 - 2008-12-02 13:37:11

あなたにオススメの質問