TRUNCATE

テーブルからすべての行を削除するには、'TRUNCATEコマンドを使用する。 これはDELETEコマンドと同じ効果があるが、大きなテーブルでは'DELETEコマンドより速い。

トランザクションまたはストアドプロシージャ内で'TRUNCATE使用すると、1つのアトミックユニットでデータに他の関連する変更を加えることができる。 このように'TRUNCATE使う場合:
  • トランザクションの切り捨てはロールバックすることができ、その場合、テーブルのストレージとコンテンツはそのまま残る。
  • テーブルはロックされ、トランザクションがコミットまたはロールバックするまで、他のセッションやトランザクションからテーブルへの同時アクセス('SELECTコマンドを含む)は許可されない。 ロールバックは、'ROLLBACKコマンドやトランザクションの実行失敗の結果として起こるかもしれない。
  • 切り捨てトランザクションが他の表にアクセスする場合、デッドロックの可能性が増大します。 切り捨てトランザクションの最初に'LOCK TABLE <tablename> IN ACCESS EXCLUSIVE MODE発行すれば、この問題を回避できる。 このコマンドの使用に関するガイドラインはLOCK TABLEを参照のこと。
  • TRUNCATE TABLEは、'DELETE FROM <table>ですべての行を削除するよりもはるかに高速であり、また、スペースを再利用するために後続の'GROOM TABLE必要としない。 しかし、同じテーブルの変更と切り捨てを同時に行おうとするトランザクションが、次のようなメッセージを見る可能性があるERROR: Cannot truncate table because of concurrent insert or update.LOCK TABLEコマンドを使用し、1つまたは複数のテーブルを切り捨てるトランザクショ ンを、その目的を達成するのに必要な時間以上アクティブにしないことで、リスクを最小限に抑えること ができる。

NPSは、切り捨てられたテーブルに対する並行トランザクションで 'SELECTsサポートする。 切り捨てられたテーブルのディスク・ストレージは、切り捨てがコミットされる前に開始されたアクティブな同時実行トランザクションがない場合にのみ解放される。 切り捨てのコミット時にそのような並列トランザクションがない場合は、コミットの数秒後にストレージは解放されます。 TRUNCATEコミットする前に開始したオープン・トランザクションは、「TRUNCATE」がコミットする前のテーブルの行をまだ見ることができる。

SELECT以外の操作で、切り捨て対象のテーブルを変更する場合は、切り捨てトランザクションのコミットまたはロールバックを待たなければならない。

切り捨てられたテーブルに対して選択する同時セッションが頻繁に発生するシステムでは、'TRUNCATEコマンドがテーブルの行数統計をゼロにリセットすることに注意してください。 これより後に開始される新しい表の照会にとっては、このリセットは、プラン作成の見積もりに良い影響を与えます。 TRUNCATEの行数統計をリセットすると、同時実行トランザクションの既存のクエリに影響を与える可能性があります。 新しい行数の統計が'TRUNCATE以前の行数と大きく異なる場合、古い問い合わせのプランナ推定が不正確なため、同時実行問い合わせの実行に時間がかかる可能性があります。

飛行中のクエリのためにテーブルの統計情報をそのまま保持したい場合は、'TRUNCATE以前のテーブルの統計情報と行数を保持するようにシステムを設定することができます。 統計情報を保持するには、データベース変数 concurrent_truncate_zero_stats を false に設定します。 この設定にすると、システムは常に表の統計情報を保持するため、新しい行が表に挿入されるにつれて統計情報が増大し、結果的に、照会の見積もりに問題が生じて実行時間が長くなる可能性があります。 デフォルトの動作を変更するには、以下のようにします。

  1. NPSシステムに nz ユーザアカウントでログインする。
  2. 任意のテキスト・エディターで /nz/data/postgresql.conf ファイルを開きます。 postgresql.conf を編集する際には注意してください。 Netezza Performance Serverシステム運用のための重要な設定パラメーターが含まれています。
  3. このファイル内で concurrent_truncate_zero_stats 定義を探して、まだ指定されていないこと、あるいはコメント化されていることを確認します。 エントリーが見つかった場合は、concurrent_truncate_zero_stats=false として、コメントを外します。 エントリーが見つからない場合は、concurrent_truncate_zero_stats=false をファイルに追加します。
  4. postgresql.conf ファイルを保存して閉じます。
  5. nzstopコマンドと'nzstartコマンドを使用して、NPSソフトウェアを停止し、再起動する。

concurrent_truncate_zero_stats変数は、'set concurrent_truncate_zero_stats to <value>コマンドを使用して、個々のNPSデータベース・セッションで設定(またはリセット)することもできる。 例えば、表ごとに異なる動作にするために、セッション・レベルでこの変数を設定することができます。 同じ表で切り捨てを行う各セッションで、一貫した動作にするために、この変数の設定を統一する必要があります。

注:切り捨てと再ロードを繰り返すテーブルでの'GENERATE STATISTICSの使用に関する以下のプラクティス:
  • TRUNCATE後(または「TRUNCATE呼び出すトランザクションがコミットした後)に「GENERATE STATISTICS」を追加してはならない。
  • 理想的には、'GENERATE STATISTICSはクエリーの前にデータをリロードしてから実行すべきである。 concurrent_truncate_zero_stats を false に設定している場合は特に重要です。 これは、Performance Server 表が大きい場合にも一般にお勧めする手法です。ロード中に自動的に収集されない統計情報 (「dispersions」列値など) があるからです。
  • GENERATE STATISTICS が各リロード後に実行されておらず、コマンドを追加するために既存のワークフローを変更するのが難しい場合は、concurrent_truncate_zero_statsがfalseである場合、バックグラウンドジョブで定期的に'GENERATE STATISTICS実行すべきである。 最後の'GENERATE STATISTICS以降、切り捨てと再読み込みが4~5回を超えないように、ジョブの頻度を選択する。

構文

空の表を切り捨てる場合の構文
TRUNCATE [ TABLE ] <name>

入力

TRUNCATE コマンドの入力は以下のとおりです。
表 1. TRUNCATE の入力
入力 説明
<name> 切り捨て対象の表の名前。

出力

TRUNCATE コマンドの出力は以下のとおりです。
表 2. TRUNCATE の出力
出力 説明
TRUNCATE TABLE コマンドは成功します。

特権

admin ユーザー、表の所有者、またはデータベースかスキーマの所有者であるか、アカウントがこの表または Table オブジェクト・クラスに対する Truncate 特権を持っている必要があります。

使用法

以下に使用例を示します。
  • bigtable からすべての行を削除します。
    MYDB.SCH1(USER)=> TRUNCATE  bigtable;
  • mytable の内容を新しいデータに置換します。
    BEGIN;
    TRUNCATE TABLE mytable;
    INSERT INTO mytable SELECT …;
    COMMIT;