J'ai demandé hier un question qui a obtenu des réponses mais n'a pas répondu au point principal. Je voulais réduire le temps nécessaire pour faire une opération MINUS
.ajouter au curseur dans l'oracle
Maintenant, je pense à faire MINUS
opération dans les blocs de 5000, en ajoutant chaque résultat d'itérations au curseur et finalement retourner le curseur. Je suivais:
V_CNT NUMBER :=0;
V_INTERVAL NUMBER := 5000;
begin
select count(1) into v_cnt from TABLE_1
while (v_cnt > 0)
loop
open cv_1 for
SELECT A.HEAD,A.EFFECTIVE_DATE,
FROM TABLE_1 A
WHERE A.TYPE_OF_ACTION='6' AND A.EFFECTIVE_DATE >= ADD_MONTHS(SYSDATE,-15)
AND A.ROWNUM <= V_INTERVAL
MINUS
SELECT B.head,B.EFFECTIVE_DATE,
FROM TABLE_2 B
AND B.ROWNUM <= V_INTERVAL
V_CNT := V_CNT - V_INTERVAL;
END LOOP;
end;
Cependant, comme vous le voyez ... à chaque itération le curseur est écrasé. Comment puis-je changer le code de sorte qu'à chaque itération il ajoute cv_1
au curseur plutôt que d'écraser?
Il est très difficile de surpasser SQL avec pl/sql. Si l'opération est lente en ligne droite, elle restera probablement lente en pl/sql. –
Je comprends cela. mais quand je le fais en lots de 5000. c'est assez rapide. – Omnipresent
en lots de 5000 la requête prend 4 secondes par rapport à 8. donc je vais bien. en deuxième itération, cela prend encore 4 secondes ... et ainsi de suite. fondamentalement, chaque requête continue ne devrait pas prendre plus de 8 secondes. – Omnipresent