• ベストアンサー

Truncate以外で高速にテーブル内全件削除する方法

お世話になります。 Oracle 9iで特定のテーブルを高速に削除したいのですが Truncateを使うと、Insertが完了し、Commitするまでの間に 読み取り一貫性が崩れるので、使いたくありません。 (他のセッションからは、当該テーブルは0件と映るのではなく 削除前の状態が見えてほしい。) なにか逃げ道ありませんでしょうか?

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

  • ベストアンサー
回答No.2

>Truncateされた後、かつ次のCommitまでの間に >他に新たにセッションが確立された場合に、この状況となります。 DDLに分類されるTRUNCATEは、非トランザクションなSQLですので、 コミットするまでもなく、自動的に即時反映です。 占有的に動作し、即時反映するので、読みとり一貫性が崩れることは ありません。 トランザクション中で削除するには、DELETE文を実行する以外に 削除の方法はありません。 データベース環境を変更できるのであれば、ログの抑制等で、 DELETE文速くすることは出来ますが。

kurinkurinkurin
質問者

補足

>> データベース環境を変更できるのであれば、ログの抑制等で、 >> DELETE文速くすることは出来ますが。 はい、こういう逃げ道を探しています。 これについて、詳しく教えていただませんでしょうか?

その他の回答 (2)

回答No.3

ALTER TABLE テーブル名 NOLOGGING; や ALTER INDEX インデックス名 NOLOGGING; をすれば、REDOログの出力が減り、相応の時間が節約できます。 当然、REDOログを出力しないことによる弊害も考慮してください。 詳しくはマニュアルで。

kurinkurinkurin
質問者

お礼

k_o_r_o_c_h_a_n さん ありがとうございます。 NOLOGGINGオプションをつけてやってみたいと思います。 ありがとうございました。

回答No.1

>他のセッションからは、当該テーブルは0件と映るのではなく >削除前の状態が見えてほしい。 このような状況にはならないと思いますよ。 他セッションで使われているテーブルは、Truncateが拒否されるハズです。 Tuncateできるなら、瞬間的には占有状態のハズですから・・

kurinkurinkurin
質問者

補足

Truncateされた後、かつ次のCommitまでの間に 他に新たにセッションが確立された場合に、この状況となります。

関連するQ&A