2009-03-05 88 views
3

當使用MySQL MyISAM表併發出ALTER TABLE語句來添加列時,MySQL會創建一個臨時表並在覆蓋原始表之前將所有數據複製到新表中。與Oracle ALTER TABLE相比,Oracle的模式更改性能如何?

如果表中有很多數據,(重建索引時,特別是),這個過程可能會非常緩慢,並且需要您在磁盤上有足夠的空間來存儲表2份。這非常煩人。

Oracle在添加列時如何工作?大桌子上速度快嗎?

我一直感興趣的是能夠做架構更改,而無需大量的停機時間。我們一直在爲我們的軟件添加新功能,這些功能需要在每個發行版中更改架構任何建議表示讚賞...

回答

6

添加沒有數據的列到Oracle中大表一般是非常快的。沒有數據的臨時副本,也不需要重建索引。當您想要將列添加到大表中並將數據回填到所有現有行的新列時,通常會出現緩慢現象,因爲現在您正在討論影響大量行的UPDATE語句。

添加列可能會導致行遷移隨着時間的推移。如果您有一個佔用80行的4行塊,並且添加的列會隨着時間的推移將每行的大小增加30%,您最終會達到Oracle必須將4行中的一行移動到其他行塊。它通過在舊塊中留下指向新塊的指針來實現,這會導致在該遷移行上的讀取需要更多的I/O。消除遷移的行可能會有一定的代價,儘管假設您使用的是企業版,但一般情況下可以不停機,但如果您有一點停機時間,則通常會更容易。但行遷移是你通常只需要擔心的事情。如果您知道某些表將來可能會大幅增加行大小,則可以通過爲該表指定較大的PCTFREE設置來提前減輕問題。

+0

我敢肯定你的意思是「如果你有一個塊中存滿了4行80%」,是嗎? – Khb 2009-03-05 01:45:05

+0

非常正確,是的。謝謝。 – 2009-03-05 03:38:39

2

關於停機時間,改變表(和一羣其他DDL操作的)取的排他鎖。不過,Oracle也可以使用DBMS_REDEFINITION軟件包在線重新定義oobjects,這確實可以縮短停機時間。