2016-01-26 35 views
0

我需要更新一個表中包含幾百萬行的兩列。做這件事最有效的方法是什麼?一個表中有幾百萬行的更新列

這將是這樣的:

update my_table set column_one = to_date('11/11/11', 'RR/MM/DD'), 
        column_two = to_date('11/11/11', 'RR/MM/DD'); 

或本:

update my_table set column_one = to_date('11/11/11', 'RR/MM/DD'); 
update my_table set column_two = to_date('11/11/11', 'RR/MM/DD'); 

或者有更好的辦法?

+3

第一個肯定 –

+0

同時更新兩列。但我認爲將它分成幾個更新是個好主意。 (每次更新1000行可能?) – jarlh

+0

閱讀:http://mysqlserverteam.com/multi-table-trick/ –

回答

2

用百萬行更新表的最有效方法是根本不執行更新操作,而是創建一個具有更新值的新表。

  1. 在創建時創建具有更新列的新表。
  2. 注意所有同義詞,授權,約束,索引。
  3. 放下舊桌子。
  4. 將新表重命名爲舊錶。
  5. 重新創建的授權,同義詞,約束,索引。
+0

並非在所有情況下! –

+0

@JeffreyKemp同意,不是在所有情況下。 – Incognito

+0

在一個不相干的筆記上,有時候票倒對我來說沒有多大意義! – Incognito

0

如果您不想創建新表,只需將其分解爲塊。

update my_table set column_one = to_date('11/11/11', 'RR/MM/DD'), 
        column_two = to_date('11/11/11', 'RR/MM/DD') 
where rownum < 1000 
AND column_one <> to_date('11/11/11', 'RR/MM/DD') 
AND column_two <> to_date('11/11/11', 'RR/MM/DD'); 

@ Incognito的答案可能更具性能。如果你的意思是「高效」,那麼花點時間寫代碼就可以試試這種方式。

+0

這是如何更高性能的,只是一舉進行更新?您現在正在將上下文切換添加到組合中。 – Boneist

+0

您誤解了這條語句'@ Incognito的答案可能更具性能。' – Ray

+0

不,我沒有 - 那是比較蘋果和橘子。我在問爲什麼你會主張更新版本,而不是直接更新。無論直接更新是否比@Incognito的答案更快,都需要進行測試,但與我最初的問題無關。 – Boneist

相關問題