新增欄位,該用alter還是create and drop
最近遇到一個需求是需要DB新增欄位 思考後發現有兩種做法 1. Alter Table ... ADD Column 2. create&drop重新建一個新的table:複製舊的資料表格式,並加入新的欄位,再將舊資料表的資料SELECT INTO至新的資料表,最後重新命名為原本的資料表名稱。 作法1的速度非常快,但是在SQL Server中,ALTER ADD的欄位是無法指定排序的,因此新加入的欄位一定會排在最後,我是認為在觀看上有點不便與醜陋。 由於兩種做法都可行,因此問了資深前輩,trade off的考量點應該要有哪些,得到一些原本沒想到的觀點,順便整理記錄一下。 1. 系統是否已經上線 已經上線的系統,如果採用方法2,風險會比較高,因為轉換資料的過程中會lock住資料,萬一資料量大的時候,需要的時間就很長,萬一有其他使用者需要使用,可能會導致連線逾時。 且轉換的過程中,萬一中途有些資料失敗了,會不知道斷在哪裡,造成資料的不一致;如果採用transcation,則會lock更多資料。 2. 造成的影響最小化 在擴充功能的時候,優先考量的一定是有沒有side effect,如果造成side effect會讓系統品質變得更難維護。而方法1跟2,基本上都不太會影響原本系統邏輯(如果當初寫在系統中的使用語法都有明確指定欄位,沒有使用select * from table的寫法),因此在變動所產生的影響最小化考量,1跟2是都可以採用的。 3. 資源耗用量 MS SQL server有提供的圖形化介面操作,可以移動欄位的順序,看起來非常的方便。但如果我們再進階一點去使用「產生指令碼」的功能,會發現 系統做的事情底層還是select into綁上交易的作法 ,只是沒讓我們看到而已,因此資料量愈大(上千萬筆),採用方法2所耗用的資源就愈多。 最終還是選擇的方法1的做法,因為影響最小,且系統已經上線使用。