面接中に質問された質問があります。私は質問に答えましたが、インタビュアーは私の答えにそれほど確信していませんでした。だから、誰かが私の理解で私を修正してください?
Q。トランケートがDDLであるのに、削除がDMLであるのはなぜですか?どちらもほぼ同じジョブを実行します(行の削除)
答えTruncateを使用している場合は、undo-table-spaceに保存せずに、データによって割り当てられたスペース全体を割り当て解除しています。ただし、削除の場合は、すべてのデータをUNDO表スペースに入れてから、すべてのデータを削除します。
上記について最良の答えを知っている人がいれば、説明してください。
DMLとDDLの違いは、それらの名前が示すほど明確ではないため、状況がややこしくなることがあります。
Oracleは、コンセプトガイドで明らかに TRUNCATE
をDDLとして分類しています ですが、DELETE
はDMLとして分類されています。
TRUNCATE
をOracleのDDLキャンプに配置した主なポイントは、私が理解しているように、次のとおりです。
TRUNCATE
はストレージパラメータ(NEXT
パラメータ)を変更でき、それらはオブジェクト定義の一部です-これはDDLキャンプにあります。TRUNCATE
は暗黙的にcommit
を実行し、ロールバック(フラッシュバックは別)できません-Oracleのほとんど(すべて?)のDDL操作がこれを実行し、DMLは実行しません。TRUNCATE
が動作しないという事実ON DELETE
トリガーは、通常のDML操作とは別に設定します(ただし、一部の直接パスDML操作もトリガーをスキップするため、明確な指標ではありません)。
同じドキュメントでは、DELETE
はUNDOを生成しますが、TRUNCATE
は生成しないので、この点でステートメントは正しいです。 (TRUNCATE
は一部のREDO
を生成するため、復元/リカバリの場合に切り捨てを再生できることに注意してください。)ただし、一部のNOLOGGING
操作では、UNDOが削減される場合があります(不明な点があります)まったくない)ので、私の意見ではそれも明確な指標ではありません。
だから私はそれを要約すると:
truncate
は、コミットしてロールバックできないという意味で「トランザクション」ではなく、オブジェクトストレージ属性を変更できます。したがって、これは通常のDMLではなく、OracleはDDLとして分類します。delete
は通常のDMLステートメントです。truncate
はdrop
、alter
、create
に似ていると思います。これらはすべてテーブルで機能するため、すべてテーブルレベルのコマンドです。 'delete'はinsert
、select
、update
に似ていますが、すべて行で機能するため、すべて行レベルのコマンドです。