D'abord, je sais que l'instruction SQL pour mettre à jour table_a
en utilisant des valeurs de table_b
est sous forme de:Performance de mettre à jour une grande table à l'aide des valeurs d'une petite table
Oracle:
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
Ce que je comprends est le moteur de base de données passera par des enregistrements dans table_a
et les mettre à jour avec les valeurs de correspondant enregistrements dans table_b
.
Donc, si j'ai 10 millions de disques dans table_a
et seulement 10 enregistrements table_b
:
Est-ce que cela signifie que le moteur va faire 10 millions d'itérations par
table_a
juste pour mettre à jour 10 dossiers? Est-ce que Oracle/MySQL/etc est assez intelligent pour faire seulement 10 itérations à traverstable_b
?Existe-t-il un moyen de forcer le moteur à parcourir réellement les enregistrements dans
table_b
au lieu detable_a
pour effectuer la mise à jour? Existe-t-il une syntaxe alternative pour l'instruction sql?
On suppose que table_a.key
et table_b.key
sont indexées.
En fait, IN/EXISTS est mieux dans Oracle que d'utiliser un JOIN (selon les critères appropriés): http://explainextended.com/2009/09/30/in-vs- join-vs-exists-oracle/ –
Intéressant. Le HACH JOIN SEMI est une optimisation intelligente. Bien que cela semble seulement important si la colonne n'est pas indexée. J'utiliserais probablement encore un JOIN qui échouerait (plus d'IMHO expressif). Mais certainement utile de savoir pour certains cas! –