Truncate Table
はじめに
Truncate Table コマンドにより、ユーザーおよびアプリケーションは、データベース テーブルのコンテンツを空にします。 この機能は、行を頻繁に削除する必要があるテーブルの場合に便利です。 Truncate Table コマンドは、同等の DELETE FROM
テーブル コマンドに比べ、実行はより高速であり、必要な入出力はより少なく、そしてはるかに少ない情報をジャーナル記録およびアーカイブします。 ETL アプリケーションや他のアプリケーションでは、使用後に削除したい、もしくはより永続的な場所(履歴テーブルなど)に移動させたい、といった大量のデータを計画する場合に、TRUNCATE TABLE
と NO RESERVE SPACE
テーブル割り当てオプションの組み合わせを使用すると便利でしょう。
要件と制約
- Truncate Table コマンドは、排他的かつ保護された書き込みロックを取得します。これにより、切り捨て(trancate)られるテーブルへアクセスしようとする並列トランザクションに対して、可視効果があります。また、テーブルはいずれにしても切り捨てられますが、
TRUNCATE CASCADE
においては依存テーブル ツリー階層のすべての層がロックされ、TRUNCATE DEFERRED
では、これらのロックはトランザクションが終了するまで保持されます。 - 前述の後、ユーザーは、
NO WAIT
またはWAIT TIME
の制限を持つトランザクションを使用して、Truncate Table コマンドを実行することができます。これにより、トランザクションは、タイムアウトが発生したり、制限回数の再試行が行われた際には、オペレーションをロールバックすることができます。 - システム テーブル、一時テーブル、およびビューは、切り詰められません。最適化やパフォーマンスのために、エンジンがこれらのテーブル タイプの一部を物理的に切り捨てることがありますが、ユーザーがその機能にアクセスすることはできません。しかしながら、ユーザーはより良いパフォーマンスを把握することはできます。
- 外部テーブルは切り捨てられます。
- Truncate Table コマンドの実行者を追跡することはできません。Truncate Table コマンドがトリガとなるアクションを記述することができる
FOR EACH STATEMENT
トリガは、InterBase ではサポートされていません。
動作の仕組み
Truncate Table は、行レベルではなくテーブル レベルで処理され、メタデータではなく、テーブル内のストアド データに対して作用します。Truncate Table は、DELETE FROM <table>
コマンドと同じ方法でテーブルのすべての行を削除しますが、DELETE
トリガ、制約のチェック、インデックスのメンテナンスといった、行レベルでのアクションは行いません。Truncate Table は通常、行レベルの削除より高速です。
Truncate Table コマンドは、トランザクション管理下にはありません。テーブルを空にする際、それを実行したトランザクションをロール バックしても、このアクションを元に戻すことはできません。Point-in-Time リカバリのみが、データを InterBase ジャーナル アーカイブから復元できます。切り捨てられたテーブルには、行データやインデックス、blob のための確保領域がありません。
Truncate Table コマンドは、切り捨てられるテーブルを参照している、他のテーブルの外部キー制約については、慎重にならないといけません。 そのもっともシンプルな形式では、外部キー制約は、テーブルの切り捨てを許可しません。InterBase Truncate Table では、この制限を超えるために、SQL 以外のランタイム拡張を提供しています。これにより、既存の外部キー制約と調整できない状況において、コマンド実行が可能かどうか、より自由な解釈ができます。Truncate Table はトランザクション管理下にありませんが、それが含まれているトランザクションの結果がコミットまたはロールバックされるまで、自分の実行を遅延させることにより、トランザクション管理下にあるように動作させることは可能です。
トピック
- Truncate Table の構文
- Truncate Table の権限
- Truncate Table のオペレーション
- Truncate Table のエラー
- Truncate Table の変更ビューでの効果
- Truncate Table の例
- Truncate Table のチュートリアル