Bonjour à tous, et voici mon interrogation.

J'ai une table de statistiques qui est mise à jour tous les 3 mois. Cette dernière est très très longue (entre 48 et 72h).

On m'a demandé de l'optimiser.
La procédure lançait une multitude d'UPDATE avec des données venant de vues assez complexe.

La première chose que j'ai fait, c'est de modifier les vues en vues matérialisées. En testant l'un des 20 UPDATE, je constatais déjà une formidable avancée.

Maintenant j'ai plusieurs choix pour mettre à jour ma table de statistiques globale. Cette dernière est constituée de 20 champs (1 par UPDATE) pour un champ composé des numéros INSEE du territoire que nous couvrons.

Soit je fais comme avant : 1 UPDATE par champ, vis à vis de sa table matérialisée, le tout mis dans une procédure.
Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
DBMS_OUTPUT.PUT_LINE('DEBUT de la MAJ champ 1 : '||SYSDATE);
UPDATE table_stat SET champ1 = 0 ;
COMMIT;
DBMS_MVIEW.REFRESH('stat1');
UPDATE table_stat
SET table_stat.champ1 =
  (SELECT stat1.champ1
  FROM stat1
  WHERE stat1.cd_insee = table_stat.cd_insee
  );
COMMIT;
DBMS_OUTPUT.PUT_LINE('FIN   de la MAJ champ1 : '||SYSDATE);
Je répète cela 20 fois, et j'obtiendrai le résultat escompté.
De plus, afin d'avoir un suivi de la procédure, j'ajouterais un INSERT INTO vers un table faisant le suivi de la procédure (je verrais ainsi où j'en suis, et le temps que ça prend pour chaque parties).
J'avais lu sur divers site qu'il y avait aussi le DBMS_ALERT, mais je ne le trouve pas satisfaisant, de même pour le UTL_FILE.
Je ne vois pas plus simple qu'une table spécifique au suivi, si vous avez des idées, je suis preneur.

Mais je reviens à mes moutons (enfin mes stats).
Voyant la puissance des vues matérialisées, je me suis dit "pourquoi ne pas faire de cette table une vue matérialisée".
Or, je constate que je n'arrive pas à faire d'UPDATE, il faut absolument un SELECT.

Alors voilà, je viens là pour voir s'il y a une autre solution qu'une procédure qui UPDATE tout, ou alors s'il y a possibilité de faire une vue matérialisée (tapant sur 20 autres tables matérialisées) et ainsi pouvoir la refresh avec une ligne de commande.
A voir aussi si l'une des solutions est plus rapide et moins lourde que l'autre.

Je vous remercie d'avance pour votre aide
PS : j'espère avoir bien formulé ma demande.


EDIT 1 :

Je viens de penser à une autre solution.

I) Je fais un REFRESH de toutes mes 20 vues matérialisées
II) Je fais une table matérialisée avec une SELECT de ces 20 tables, pour obtenir mes 20 champs.

Pour faire la liaison, je prends le CD_INSEE d'une table de nomenclature, et je fais des jointures externes avec toutes les tables.

Avec ce SELECT, je crée ma vue matérialisée générale (avec les 20 champs)

Pour mettre à jour cette dernière, je crée une procédure qui va faire un REFRESH de mes 20 vues matérialisées, puis enfin, je fais un REFRESH de ma vue matérialisée générale (en toute fin de procédure).
Dans celle ci, je fais des INSERT INTO dans une table de suivi de la procédure.

Qu'en pensez vous?

Merci ^^