Oracle-11g
添加與刪除列的持續時間
我有一個包含超過 5000 萬行的表。
當我添加一列時:
ALTER TABLE my_table ADD my_column NUMBER;
它非常快。
在添加列之後,我將其刪除。
ALTER TABLE my_table DROP COLUMN my_column;
需要3分鐘!
為什麼添加列如此之快,而在不填充的情況下刪除它卻很慢?
當您添加一個可為空且不提供預設值的列時,數據庫不必對錶數據本身執行任何操作。行沒有改變,只有表元數據被改變。
(這是由於使用了磁碟上的行格式。通常/在正常情況下/對於普通數據類型,行尾的空列不儲存在行塊中。)
另一方面,當您物理刪除一列(而不是隱藏/設置未使用)時,至少需要檢查所有行以檢查是否需要刪除任何數據。所以理論上最好的情況成本是全表掃描。(我相信也涉及一些表鎖定。)最壞的情況是所有行都必須重寫。這可能非常昂貴。