• ベストアンサー

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

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

  • Oracle
  • 回答数5
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • トランザクションを張って対話型でのコミット・ロール

    トランザクションを張って更新処理を行った後に、 ユーザの「はい」「いいえ」ボタンによって、 トランザクションのコミットとロールバックを切り替えることは可能でしょうか。 処理の流れは以下の様になります。 1.データ更新前の値を取得 2.トランザクションの開始 3.データ更新 4.データ更新前の値とデータ更新後の値を比較して、   差分がある場合は確認メッセージを表示する。 5.確認メッセージで「はい」がクリックされた場合はコミットする。 6.確認メッセージで「いいえ」がクリックされた場合はロールバックする。 実装方法はどのようでも構いません。 どなたかご教授ください。

  • C# トランザクション処理

    DataSetのTableAdapterでSQL Serverへのデータ挿入、更新、削除を行います。 try { ta.UpdataQuery(.....); } catche { Exception; } といった処理をしますが、トランザクション処理をする場合、 try { // トランザクション開始 ta.UpdataQuery(.....); // コミット } catche { // ロールバック Exception; } といった感じになるかと思いますが、どのようにコードを書けばよいのでしょうか?手元にコードがありませんので詳細が書けませんが、よろしくお願いします。

  • カーソルがコミットするとクローズされてしまう。

    オラクルのDBで環境はUNIX(IBMのマシン)です。 DBについて詳しくありませんが、以下のようなことを行いたいと考えています。 1.あるDB(DB-A)のレコードを特定のキーの昇順に全レコード読み込む。(特定のキーは、例えば商品コードなど) 2.1レコードを読み込む毎に、他のDB(DB-B)を読み込んだレコードを元に、更新したい。 その際、1レコードを読み込む都度、 2-1.トランザクションの開始 2-2.DB-Bの更新 2-3.コミット又はロールバック のようにしたい。 上記のことを考えて以下のような作りにしました。 1.カーソルのオープン 2.以下のループを作成  2-1.DB-Aから1レコードのフェッチ  2-2.トランザクションの開始  2-3.DB-Bの更新  2-4.コミット(ロールバック) しかしながら、コミット(又はロールバック)を行うことにより、カーソルがクローズされてしまい、最初の位置にカーソルが戻ってしまいます。(私がコーディングして試験したわけではありません。このような報告をうけました) それで、カーソルが戻らずに、全レコードを処理するようにしたいのですが、どのようにしたら良いのでしょうか。ご存じの方おりましたらアドバイスをお願いします。

  • トランザクションとlast_insert_id

    トランザクション中にinsertする予定のテーブル(未コミット)のauto_increment値を取得することはできるのでしょうか。 以下のような処理を期待しているのですが、hoge1テーブルのauto_increment値が取得できずに困っております。last_insert_id に関わらず、hoge1テーブルのauto_increment値が取得できる方法があれば教えてください。 (1) トランザクション開始 (2) $sql=" INSERT INTO hoge1(name) value('あああ'); "; (3) ( ロールバック ) (4) $key=mysql_insert_id(); (5) $sql2=" INSERT INTO hoge2(hoge1_primary,age) value($key,'20歳'); "; (6) ( ロールバック ) (7) コミット (8) トランザクション終了 よろしくお願いします。 環境: php5,mysql5 (InnoDB)

    • ベストアンサー
    • MySQL
  • オフライン中のトランザクションについて

    表領域をオフラインにした場合、オフライン前に開始されたトランザクションは有効ですが、オフラインのまま、コミット、または、ロールバックして、表領域をオンラインにしても、整合がとれるのはなぜなのでしょうか。 コミットするか、ロールバックするかの情報はどこに保持してるのか疑問です。 (オフラインにしてから、ファイルをリネームし、 トランザクションをロールバックして、 ログをアーカイブし、DB再起動後に、ファイル名を戻して、 オンラインにすると、ちゃんとロールバックされています。 同じ操作で、コミットするとちゃんとコミットされています。 知っている方には当然なのでしょうが、私にとっては、不思議です) 詳しい方がみえましたらご教授お願いいたします。

  • oracle10g統計情報取得の確認方法

    Oracle 10gで統計情報が取得されたことを確認するSQL文を教えてください。 統計情報の取得方法としては、 Primary Key、Indexを再作成した後、DBMS_STATS.GATHER_SCHEMA_STATSを使用して統計情報を取得しております。 よろしくお願いします。

  • mysqlでCSVインポートでトランザクション管理出来る

    只今、mysqlを使用して開発しております。 行き詰まっておりまして 大変申し訳ありませんが、ご教授の程、よろしくお願いいたします。 要件は以下になります。 ・CSVファイルデータをインポートする。 ・CSVファイルは複数なので、全ての処理が終わった段階でコミット・もしくはロールバックする。 (トランザクション管理が出来ればよいです。) ※LOAD DATA INFILEでトランザクション管理しようとしたのですが LAODのトランザクション管理は5.1系じゃないと出来ないようですので、 出来ませんでした。 mysqlのバージョン :5.0.24

    • ベストアンサー
    • MySQL
  • 大量にデータを更新するテーブルの統計情報について

    大量にデータを更新するテーブルの統計情報の取得タイミングについてついて質問があります。 該当のテーブルはワークテーブルでテーブルの1/3程の大量データを毎回delete,insert,selectの順番で処理をおこなっています。 大量のデータを毎回更新しているのでselect文の際に統計情報が古いため実行計画が正しくなく処理が遅くなる可能性があるのでは無いかと心配しております。 統計情報は、取るべきでしょうか?取る場合は何時のタイミングで取るべきでしょうか? Oracle 9iを使用しています。 宜しくお願い致します。

  • トランザクションの考え方の疑問点

     トランザクションについてネットでいろいろ調べたのですが、 ピンと来ていないので下記の意味合いで合っているのか、 教えて頂けないでしょうか? ・トランザクションは、データベースに対してかかる (テーブル単位にかかるわけではない) ・SQLでINSERT、UPDATE、DELETEのようにテーブルに更新処理を 走らせた時、そのテーブルがロックされる ・コミットが終わるまではロックはかかったまま ・失敗すればロールバックでデータを元に戻せる  …こんな風に考えていますが、 ここまでは合っているでしょうか? また、下記からが疑問なんですが… ・ロックの種類は、SQLの書き方で決められるみたいですが、 特に指定しなかったらテーブルロックになるものなのでしょうか? ・SELECT中は、ロックがかかるものなのでしょうか?

  • リンクサーバー間のトランザクション

    SQL Server2008のトランザクションについてお伺いします。 リンクサーバーのSQL Server2008へデータを登録したのですが、 ロールバックしても元に戻りません。 リンクサーバーのSQL Server2008へのトランザクションは 皆さまどのようにされているのでしょうか SQL Server2008のトランザクションについてお伺いします。 リンクサーバーのSQL Server2008へデータを登録したのですが、 ロールバックしても元に戻りません。 リンクサーバーのSQL Server2008へのトランザクションは 皆さまどのようにされているのでしょうか