首先值一張大桌子的,我知道,SQL語句從table_b
更新table_a
使用值是形式:性能更新使用從一個小桌子
甲骨文:
UPDATE table_a
SET (col1, col2) = (SELECT cola, colb
FROM table_b
WHERE table_a.key = table_b.key)
WHERE EXISTS (SELECT *
FROM table_b
WHERE table_a.key = table_b.key)
的MySQL :
UPDATE table_a
INNER JOIN table_b ON table_a.key = table_b.key
SET table_a.col1 = table_b.cola,
table_a.col2 = table_b.colb
我的理解是數據庫引擎將在table_a
經歷記錄和匹配與值進行更新記錄在table_b
。
所以,如果我有table_b
在table_a
1000萬點的記錄,只有10條記錄:
這是否意味着發動機將通過
table_a
做10個百萬只的迭代更新10條記錄? Oracle/MySQL /等足夠聰明,只需要通過table_b
做10次迭代?有沒有辦法強制引擎實際遍歷
table_b
中的記錄而不是table_a
來執行更新?是否有一個替代語句的SQL語句?
假設table_a.key
和table_b.key
進行索引。
實際上,IN/EXISTS在Oracle中比使用JOIN更好(給出適當的標準):http://explainextended.com/2009/09/30/in-vs- join-vs-exists-oracle/ –
有趣。 HASH JOIN SEMI是一個聰明的優化。儘管只有列沒有編入索引似乎很重要。我可能仍然會使用JOIN失敗(更具表現力的恕我直言)。但對於某些情況下的知道絕對有用! –