2011-06-17 6 views
1

Je veux faire une requête ou une fonction dans Oracle ce qui peut mettre à jour ~ 24000 lignes. Par exemple, une requête de mise à jour ressemble à ceci:Oracle mise à jour, faire ~ 24000 changements

update numbers 
set status = 1 and some_id = 123123 
where number_id = 1231; 

"some_id" et "number_id" sont différents dans chaque requête.

Le problème est de faire cela un par un prend trop de temps, j'ai besoin d'une solution plus rapide.

+0

some_id et le statut prennent la valeur d'où? –

Répondre

3

Mettez les valeurs différentes dans une table puis de les utiliser dans votre requête:

update numbers n 
set status=1, 
    some_id = (select some_id from newtable t where t.number_id = n.number_id) 
where number_id in (select number_id from newtable); 
0

Ecrivez une procédure stockée PL-SQL et passer dans les paramètres. Appelez-le une fois et faites-le.

Ou utilisez PreparedStatement et regroupez vos demandes.

Ils prennent probablement trop de temps parce que vous faites un aller-retour pour chacun d'entre eux. Batch vous aidera beaucoup, car vous ne ferez qu'un seul aller-retour.

1

Il semble que vous ayez câblé les prédicats et mis à jour les valeurs dans votre requête. Vous pourriez être en mesure d'améliorer les performances en utilisant des variables de liaison. Avec les variables bind, Oracle n'a besoin que d'un seul hard-parse pour toutes les instructions SQL UPDATE 24k identiques, au lieu de 24k hard-parse (et de plans d'exécution de mise à jour) pour 24k instructions SQL UPDATE distinctes.

Avec Java:

update numbers 
set status = ?, some_id = ? 
where number_id = ?; 

avec d'autres outils:

update numbers 
set status = :1, some_id = :2 
where number_id = :3; 
Questions connexes