2017-02-09 50 views
0

我被要求研究一個手動過程,我的一個同事正在一次又一次地完成。添加列 - SQL服務器表

他有時需要在一張大表(2億行)上添加一個新列,這需要1個多小時才能完成。在你問之前,是的,列是可以空的,但有時新列將有90%的數據。

,而不是新增的列到現有的表,他的...

  1. 創建一個新表
  2. 選擇(*)從舊錶(插入到新)
  3. 再添新列作爲他的腳本的一部分

然後,他刪除舊錶並將新表重新命名爲原始,添加索引,然後壓縮。他說這樣快得多。

如果是這樣話,我會嘗試寫SSIS包,試圖使這一過程更加無縫

任何意見是值得歡迎的最佳途徑!

感謝

+0

源表是否更新? –

+0

是的 - 源表格現在每月更新一次,但會立即更新爲每週 – Easy987us

+0

爲什麼您經常添加新列?這可能可以通過稍微改變你的數據結構到更規範的東西來解決。你能發佈表格定義和新列的原因嗎? – iamdave

回答

0

創建新表的結構和所有的數據移動到該表,並刪除之前的表是一個很好的方式只是幾個數據,你可以在SQL Server通過嚮導做。
,但它是解決這個問題最糟糕的方式(數百萬個數據)。

對於大量數據(數百萬條記錄),您應該使用「變更表」。

Alter Table MyTable
ADD NewColumn nvarchar(10) null

新列將添加到表的最後一欄。 如果你使用這個腳本,它只需要少一秒鐘,因爲所有的數據都不會移動,你只需要在表格中添加一個新的列。

但是,如果您使用嚮導方法,正如您所提及的數百萬條數據記錄,則需要花費數小時。

0

阿里說

alter Table MyTable ADD NewColumn nvarchar(10) null

但隨後在數據的90%補。因爲他有一個表已與它在和他在副本中加入的關鍵,所以這是所有他需要:

UPDATE MyTable 
SET [NewColumn] = b.[NewColumn] 
FROM MyTable a INNER JOIN NewColumnTable b ON a.[KeyField]= b.[KeyField] 

會快很多。你可以在SSIS中做到這一點,但如果這種情況發生很多,那麼對於幾行SQL來說就不值得。