PR

 正解は2と3です。

 設問の2つのSQL文は,選択肢にあるとおり,指定したテーブルのデータをすべて削除するSQL文です。ただし,内部的には全く異なる処理を行います。

 それでは,この2つの違いを簡単にまとめて見ましょう(図1)。

図1●DELETE文とTRUNCATE文の比較
特徴DELETE文TRUNCATE文
(1)SQLの分類DML文DDL文
(2)処理の取り消しできるできない
(3)処理速度(相対的)遅い速い
(4)無駄な領域の解放しないする

 では,簡単に解説します。

特徴(1)

 SQL文の分類は,試験範囲に含まれますので,どのSQL文がどのカテゴリに入るかはちゃんと覚えましょう。

特徴(2)

 DML(Data Manipulation Language)文にはINSERT,UPDATE,DELETEなどのSQL文が含まれ,データベース・トランザクションの一部として実行されます。トランザクション実行中のユーザーは,明示的に,COMMIT文やROLLBACK文を使用して処理を確定したり,取り消したりすることができます。

 一方,DDL(Data Definition Language)文は,1文が単独のトランザクションとなり,DDL文自体が成功したとき,自動的に処理はコミットされます。従って,TRUNCATE文の実行後,処理を取り消す(ROLLBACKする)ことはできません。また,DDL文を実行するとそれまでにそのセッションで実行されていたトランザクションは自動的にコミットされます。

特徴(3)

 DELETE文は,実行後にROLLBACKできることを保証するため,変更前の情報(すべての行)を別の領域(UNDOセグメントと呼ばれる領域で,「Bronze DBA」の試験範囲に含まれます)に退避させます。この処理は,データ件数に依存して遅くなります。TRUNCATE文は行データを退避させることなく,領域を解放するだけなので,データ件数に関係なく処理はすぐに完了します。

特徴(4)

 DELETE文は,既存の行データを削除するだけで,そのテーブルが保有する領域には,影響を与えませんが,TRUNCATE文は,テーブル作成後に拡張されたすべての領域を解放します(オプションを指定することにより,領域を解放しないように設定することも可能です)。

 以上の特徴から,選択肢の2と3が正解であることが分かります。

 なお,DDL文はデータベース管理者のみ実行できるというのは,明かに誤りです(CREATE TABLE文もDDL文です)。従って,選択肢5は誤りです。

 また,処理対象の表が外部キーによって参照されている場合,DELETE文は,子データの有無により成功する場合と失敗する場合があります。TRUNCATE文を実行するためには,その表を参照する外部キー制約を削除するか無効にしない限り失敗しますので,選択肢4も誤りです。