• ベストアンサー

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

いつもお世話になっております。 あるシステムの処理で 大量データ挿入⇒統計情報の取得⇒挿入したデータを基にファイル作成 という処理を行っております。 ファイル作成時に失敗した際に、ロールバック処理を行うように 設定しているのですが、既にデータが挿入されてしまっています。 初心者でいまいち統計情報の取得が良く分かっていないのですが、 統計情報を取得するSQL文を流した時点でトランザクションは コミットされるのでしょうか? よろしくお願い致します。

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.4

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

その他の回答 (4)

  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.5

質問からの先読みとなりますが、 統計収集パッケージを実行するとコミットされてしまうようなので不可、 となりますと、動的サンプリングを使うと良いかもしれません。 動的サンプリングとは、SQLを実行する瞬間に表の統計情報を取得するやり方で、SQLのヒント句もしくは、DBの、OPTIMIZER_DYNAMIC_SAMPLINGパラメータで動作を制御できます。 具体的には、 大量データ挿入⇒挿入したデータを基にファイル作成(動的サンプリングヒント句つき) で対処できるのではないかと思います。 詳しい使用方法は、Oracleパフォーマンスチューニングガイドや、各種Oracle系情報サイトなどで調べてみてください。 <10gドキュメントのリンク> http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/index.htm

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.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扱いなので動きとしては納得できます。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

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

pepepepepe
質問者

補足

何度もご回答ありがとうございます。 質問の主旨が伝わっていないようなので、再度補足させていただきます。 説明不足で申し訳ありません。 大量データ挿入⇒統計情報の取得⇒挿入したデータを基にファイル作成 の、ファイル作成(同一トランザクション内)に失敗した場合、ロールバック処理が動くようになっています。 ログを見てみるとロールバックをされているようなのですが、 データが確定されてしまっています。 統計情報の取得をしてしまうと、同一トランザクション内でもロールバックは出来ないのでしょうか?

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

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

pepepepepe
質問者

補足

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

関連するQ&A