web-dev-qa-db-ja.com

DDLが切り捨てられるのはなぜですか?

面接中に質問された質問があります。私は質問に答えましたが、インタビュアーは私の答えにそれほど確信していませんでした。だから、誰かが私の理解で私を修正してください?

Q。トランケートがDDLであるのに、削除がDMLであるのはなぜですか?どちらもほぼ同じジョブを実行します(行の削除)

答えTruncateを使用している場合は、undo-table-spaceに保存せずに、データによって割り当てられたスペース全体を割り当て解除しています。ただし、削除の場合は、すべてのデータをUNDO表スペースに入れてから、すべてのデータを削除します。

上記について最良の答えを知っている人がいれば、説明してください。

15
Ravi

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ステートメントです。
15
Mat

truncatedropaltercreateに似ていると思います。これらはすべてテーブルで機能するため、すべてテーブルレベルのコマンドです。 'delete'はinsertselectupdateに似ていますが、すべて行で機能するため、すべて行レベルのコマンドです。

2
RahulDeep Attri