Quand on veut optimiser, il faut savoir ou passe le temps.

La méthode de programmation utilisée n'est certe pas optimale, mais je pense que le temps passe dans Ctx_Doc.policy_filter.
Avant de faire une réécriture de ton code, lance ta proc en remplaçant l'appel à Ctx_Doc.policy_filter par null; et mesure le temps. Sur une machine moderne, normalement, pour 3 millions d'enregistrement cela va prendre un temps qui se compte en minutes, peut être en dizaines, mais pas plus, mais pas en heures.
Tu te rendra donc probablement compte que cet appel bouffe la majeure partie de ton temps de traitement et que tu ne changera pas d'ordre de grandeur de temps de traitement en changeant beaucoup l'architecture de ton code.
Si je ne me trompe pas, la façon la plus simple si tu est en multipro est de faire des traitements paralelles avec des plages de doc_id ou avec des modulo de doc_id (moins performant pour des problèmes de contention au début, mais assez souple pour faire varier le nombre de process).
A condition de ne pas déjà saturer le CPU avec un seul traitement.... Mais aujourd'hui les machines sont multiproc.
Partager