2017-02-01 70 views
0

想知道是否有辦法使SQL語句的速度更快。如何加快此更新聲明

UPDATE table_one SET column_x = table_two.column_x FROM table_two 
WHERE table_one.column_y = table_two.column_y; 

當前上述查詢已經運行了3個小時以上。有關如何使其更快的建議?

詳情:

  • table_one取得了1.9億的記錄
  • table_two取得了3.9億的記錄
  • column_x和COLUMN_Y兩個表中都是整數。
  • 兩個表中的COLUMN_Y被索引

AM上的虛擬機中運行的RAM 120GB和在PostgreSQL 9.3 22芯。

+0

問題,WHERE條款的順序是否重要?即如果我們說'table_two.column_y = table_one.column_y'而不是'table_one.column_y = table_two.column_y'? – lukik

+0

如果我的建議對你沒有幫助,而且你還在尋找解決方案,請添加運行你的命令的解釋分析結果。 –

回答

3

你並不需要更新所有記錄,至少:

UPDATE table_one 
     SET column_x = table_two.column_x 
    FROM table_two 
     WHERE table_one.column_y = table_two.column_y 
     AND table_one.column_x != table_two.column_x; 

也大抵可以幫助是兩個領域的X和Y兩個表建立索引。

+0

我的理解是,非索引列將處理插入/更新比索引更快,因此離開table_one.column_x未索引的原因,因爲它是我們正在更新的一個.. – lukik

+0

但也可以使用'索引只掃描 –

+0

在這種情況下,我正在更新所有記錄,因爲我已確保'table_one' *中的所有記錄* - 我們正在更新的表格* *包含在'table_two' *中 - 我們正在更新的表格 - *。那麼你對'你不需要更新所有記錄'的建議仍然存在? – lukik