IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Table / VUE Materialisée / Performance


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut Table / VUE Materialisée / Performance
    Bonjour j'aurais besoin d'un petit coup de pouce ^^
    je suis sur une base oracle 9i
    j'executé des requete bien tordue 16 jointures à peu pres

    biensur les perf pour ce genre de requete sont mauvaises
    en regardant bien le code je me suis apperçu que la requete etait en 2 bloques symétrique sur le principe une table enorme (80 millions de lignes) joint a des tables plus petites ( de 200 à 4000 lignes)

    l'une des deux gros table (celle de 80 millions de lignes ) porte sur au moins 15 ans de prod. hors seul l'année en cours m'est util. j'ai du souhaité faire une VUE materialisée sur l'année avec les memes index ( normalement les deux ont la meme structure ; j'ai fais un create as select...puis ajoute des index)

    ma VUE ne fait plus que 200 milles lignes !! jusque là tout va bien


    sauf que ma requete ramme 3 fois plus en utilisant la vue ....

    avec la version normal g un nested loop et tout le reste des jointure passe en hash join

    avec la version utilisant la vue j'ai 5 ou 6 nested loop qui apparaissent..

    en Bref : il va plus vite à parcourir 11 milions lignes que 200 milles!!

    quelqu'un aurait une idée ??

  2. #2
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    déjà, de ne pas poster 2 fois le même message

    Bon, blague à part, sans avoir une idée de la requête, un petit plan d'exécution, cela va relever un peu de la divination pour t'aider.

    A la limite, j'essayerais de voir ce que donne la requête sur la vue matérialisée avec le plan d'exécution de ta grosse table (en clair d'utiliser le hint HJ)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut Explain plan
    Désolé pour le message en double..
    voici l'explain plan de ma fonction (en piece jointe..)

    Voici comment ce presente les jointures
    rsbmtp mtp, rsbcfa cfa, rsbpol pol, rsbcai cai, rsbbef bef, rsbtrt trt,
    rsbstr str, rsbfco fco_cfa, rsbfco fco_str, rsbcbo cbo, rsbcsd csd, rsbter ter, rsbcie cie, rsbdev dev, rsbtba tba, rsbncl ncl,
    mtp.cfaseqx = cfa.cfaseqx (+)

    and mtp.cbocodc = cbo.cbocodc
    and mtp.ciecodc = cbo.ciecodc
    and mtp.csdcodc = csd.csdcodc (+)
    and mtp.ciecodc = csd.ciecodc (+)
    and mtp.strseqx = str.strseqx (+)
    and mtp.ciecodc = cie.ciecodc
    and mtp.tercodc = ter.tercodc
    and mtp.ncenatx = ncl.ncenatx
    and mtp.devcodc = dev.devcodc
    and mtp.tbaseqx = tba.tbaseqx
    Images attachées Images attachées   

  4. #4
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    C'est pas que je veux jouer les rabat-joie, mais je pense que la requête peut être utile aussi, ne serait-ce que pour voir comment est construit la clause where pour savoir s'il est utile d'avoir 2 requêtes dans un union all ou si on peut le jouer en une passe (vue que tu fais des fulls quasiment de partout, je pense qu'il peut avoir une chance que cela soit jouable)

    Je vois aussi que tu as des tables qui apparaissent plusieurs fois et qui sont aussi lue en FULL (en survol, je vois déjà RSBFCO, RSBTRT (une fois en direct, une fois au sein d'une vue apparemment)). C'est pareil, est-il utile de lire 2 fois la table et n'est-il pas possible de résoudre ton besoin avec une seule passe. Vu que tu fais un full sur une table, donc la ligne que tu vas chercher sur le deuxième appel de ta table, tu l'as déjà lu avec la première.

    Il faut peut être chercher à utiliser les possibilités du DECODE, du CASE ou même des fonctions analytiques

    Une "erreur" qui est faite souvent c'est de coder comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT A.Master_Key, SUM(B.Total), Sum(C.Total)
    FROM Master A, Detail B, Detail C
    WHERE A.Master_Key = B.Master_Key
    AND A.Master_Key = C.Another_Master_Key
    Group by A.Master_Key
    Tu vas lire la table DETAIL 2 fois, si les index sont bons et que les volumes sont faibles, ca peut aller, mais si tu fais un full sur DETAIL, alors il vaut mieux coder comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT A.Master_Key, 
    sum(case when A.Master_Key = B.Master_Key THEN A.TOTAL ELSE 0 END),
    sum(case when A.Master_Key = B.Another_Master_Key Then A.TOTAL ELSE 0 END)
    FROM Master A, Detail B
    WHERE A.Master_Key in (B.Master_Key, B.Another_Master_Key
    Group by A.Master_Key
    La table détail est lu uniquement une fois

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut Requete SQL
    Bonne Info ,merci , j'aurais jamais pensé à tourner une requete comme ca...
    je vais voir ce que ca peut donnée
    en attendant voici la requete ...
    ps :
    les tables lourdes sont la mtp et mts ( mais bon surtout la mtp).
    Fichiers attachés Fichiers attachés

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut jointure
    Sympa t'as structure !!
    t'aurais pas un equivalent pour les jointures ouverte ??

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Quelques idées d'opti :
    1/ LTRIM(RTRIM()) à remplacer par TRIM()
    2/ IN (SELECT DISTINCT : distinct inutile.
    3/ AND TO_CHAR(tba.tbafind,'mm') = 05 : Eviter les conversion mettre = '05'
    4 Voir si remplacer marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECt ...DECODE(str.strseqx,NULL,NULL,DECODE(R1.MAX_EXE,2007,'EN_COURS','RUN_OFF')) AS ETAT_CONTRAT,
    ...   
    FROM ... (SELECT rsbtrt.trtnumx, MAX(rsbtrt.trtrefn) AS MAX_EXE 
      FROM rsbtrt WHERE rsbtrt.supcodc = 'N'
      GROUP BY rsbtrt.trtnumx) R1
    ... WHERE ...  AND trt.trtnumx = R1.trtnumx (+)
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECODE(str.strseqx,NULL,NULL,
    	DECODE( (SELECT MAX(trtrefn) FROM rsbtrt r1 
    		WHERE r1.supcodc = 'N' AND r1.trtnumx = trt.trtnumx),
    		2007, 'EN_COURS','RUN_OFF')
    	) AS ETAT_CONTRAT,
    5/ Essaye d'optimiser chaque requete de l'UNION séparément

Discussions similaires

  1. Tables désolidarisées, vues et performances
    Par mister3957 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 27/12/2010, 12h50
  2. Table / VUE Materialisée / Performance
    Par Narold dans le forum SQL
    Réponses: 0
    Dernier message: 20/09/2007, 15h41
  3. Réponses: 3
    Dernier message: 04/07/2006, 17h07
  4. vue materialisée: rafraichissement fast
    Par aline dans le forum Oracle
    Réponses: 6
    Dernier message: 04/01/2006, 10h51
  5. [Oracle 9] Vue materialisée indexée et optimisation
    Par scornille dans le forum Oracle
    Réponses: 4
    Dernier message: 18/11/2005, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo