- ベストアンサー
Truncate以外で高速にテーブル内全件削除する方法
お世話になります。 Oracle 9iで特定のテーブルを高速に削除したいのですが Truncateを使うと、Insertが完了し、Commitするまでの間に 読み取り一貫性が崩れるので、使いたくありません。 (他のセッションからは、当該テーブルは0件と映るのではなく 削除前の状態が見えてほしい。) なにか逃げ道ありませんでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>Truncateされた後、かつ次のCommitまでの間に >他に新たにセッションが確立された場合に、この状況となります。 DDLに分類されるTRUNCATEは、非トランザクションなSQLですので、 コミットするまでもなく、自動的に即時反映です。 占有的に動作し、即時反映するので、読みとり一貫性が崩れることは ありません。 トランザクション中で削除するには、DELETE文を実行する以外に 削除の方法はありません。 データベース環境を変更できるのであれば、ログの抑制等で、 DELETE文速くすることは出来ますが。
その他の回答 (2)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
ALTER TABLE テーブル名 NOLOGGING; や ALTER INDEX インデックス名 NOLOGGING; をすれば、REDOログの出力が減り、相応の時間が節約できます。 当然、REDOログを出力しないことによる弊害も考慮してください。 詳しくはマニュアルで。
お礼
k_o_r_o_c_h_a_n さん ありがとうございます。 NOLOGGINGオプションをつけてやってみたいと思います。 ありがとうございました。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
>他のセッションからは、当該テーブルは0件と映るのではなく >削除前の状態が見えてほしい。 このような状況にはならないと思いますよ。 他セッションで使われているテーブルは、Truncateが拒否されるハズです。 Tuncateできるなら、瞬間的には占有状態のハズですから・・
補足
Truncateされた後、かつ次のCommitまでの間に 他に新たにセッションが確立された場合に、この状況となります。
補足
>> データベース環境を変更できるのであれば、ログの抑制等で、 >> DELETE文速くすることは出来ますが。 はい、こういう逃げ道を探しています。 これについて、詳しく教えていただませんでしょうか?