4 votes

Mise à jour retardée dans Oracle PL/SQL

J'ai une procédure PL/SQL simple, avec un curseur et j'itère dessus. À chaque itération, je fais une déclaration UPDATE (après avoir exécuté une certaine logique commerciale sur les données).

Cependant, s'il y a beaucoup d'itérations (des dizaines de milliers), cela peut devenir assez lent, parce qu'à chaque itération, il y a une seule instruction UPDATE.

Existe-t-il un moyen de "retarder" ces mises à jour de manière à ce qu'elles soient exécutées en une seule fois (et donc beaucoup plus rapidement).

Modifier : Oracle 11

11voto

Brian Points 7072

Si vous ne parvenez pas à trouver un moyen d'utiliser directement le langage SQL (en évitant la boucle for), vous serez probablement en mesure d'améliorer les performances en utilisant les fonctions de collecte de BULK de pl/sql.

Exemple d'article ici.

Extrait de syntaxe

 LOOP
    FETCH c_orders
    BULK COLLECT INTO v_order_ids, v_currency_codes, v_amounts_local
    LIMIT 100;
    EXIT WHEN v_row_count = c_orders%ROWCOUNT;
    v_row_count := c_orders%ROWCOUNT;
    FOR i IN 1..v_order_ids.count LOOP
      v_amounts_usd(i) := currency_convert (v_amounts_local(i),
                                            v_currency_codes(i));
    END LOOP;
    FORALL i IN 1..v_order_ids.count
      UPDATE open_orders /* bulk bind */
      SET    amount_usd = v_amounts_usd(i)
      WHERE  order_id = v_order_ids(i);
  END LOOP;

2voto

steve Points 3500

Je ne vois pas d'analyse du problème, mais je vois des gens qui font beaucoup d'hypothèses et tirent des conclusions hâtives. Pour une approche plus systématique, je recommande ce qui suit :

  • Activez le traçage de niveau 10046 pour la session lorsque le travail de mise à jour est exécuté afin de voir où passe la majeure partie du temps.
  • Obtenir des statistiques au niveau de la session avant et après l'exécution de la tâche de mise à jour.

Voyez où vous passez le plus de temps et attaquez-vous au vrai problème.

1voto

Roger Cornejo Points 859

Essayez, dans la mesure du possible, d'exécuter la logique commerciale dans l'instruction de mise à jour. Ce sera beaucoup plus rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X