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 :

Performance sur simple requete


Sujet :

SQL Oracle

  1. #21
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    essaye de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      AND HD.COINI NOT IN (SELECT NUCPT FROM INTERV I2 WHERE I2.CTINT='I')
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      AND NOT EXISTS (SELECT 1 FROM INTERV I2 WHERE I2.CTINT='I' AND I2.NUCPT = HD.COINI
    Faudrait peut-être se passer de la jointure externe pour faire un UNION aussi

    Et aussi :
    AND DAHIS <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON')
    AND DAHIS=(SELECT MAX(HC2.DAHIS)
    FROM HISCPN HC2
    WHERE HC1.NUFDP=HC2.NUFDP
    AND HC1.NUBIX=HC2.NUBIX
    AND HC2.NCCOF=7
    AND HC2.DAHIS <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON'))
    ) HC
    La condition en rouge est inutile puisqu'elle est déjà dans la recherche du MAX en vert

    Ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND HC.NUBIX = HN.NUBIX AND C.COINT = HD.COINC
    2 conditions implicites mais dans les requêtes compliquées ça vaut le coup de les écrire quand même

    Et il ne manque pas une jointure du genre :

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND HC.NUBIX = HN.NUBIX AND C.COINT = HD.COINC
    Comme tu me la indiqué, j'ai changer en En revanche est déjà présent.

    La jointure n'est pas nécessaire.

    Pour moi le pb reste cette sous requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (SELECT NUBIX,NUFDP,MHPND,CODEV FROM HISCPN HC1 WHERE NCCOF=7 
    AND DAHIS=(SELECT MAX(HC2.DAHIS) FROM HISCPN HC2 WHERE HC1.NUFDP=HC2.NUFDP AND HC1.NUBIX=HC2.NUBIX AND HC2.NCCOF=7 AND HC2.DAHIS <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON')) ) HC
    Alors que quand je la lance toute seul elle dure 5s.

  3. #23
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    T'as essayé avec le WITH ?

    du coup tes valeurs "max" seraient précalculées et pourraient prendre moins de temps...

  4. #24
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par zizou771 Voir le message
    Comme tu me la indiqué, j'ai changer en
    Je t'ai pas dit de changer mais d'ajouter

    Citation Envoyé par zizou771 Voir le message
    La jointure n'est pas nécessaire.
    je sais mais une jointure explicite peut aider le CBO... ce serait pas mal que tu suives les recommandations avant d'être imaginatif

    Si tu as :
    A=B
    B=C
    Ca vaut le coup d'ajouter A=C même si c'est l'évidence pour toi, ça peut aider l'optimiseur.

    Citation Envoyé par zizou771 Voir le message
    Pour moi le pb reste cette sous requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (SELECT NUBIX,NUFDP,MHPND,CODEV FROM HISCPN HC1 WHERE NCCOF=7 
    AND DAHIS=(SELECT MAX(HC2.DAHIS) FROM HISCPN HC2 WHERE HC1.NUFDP=HC2.NUFDP AND HC1.NUBIX=HC2.NUBIX AND HC2.NCCOF=7 AND HC2.DAHIS <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON')) ) HC
    Alors que quand je la lance toute seul elle dure 5s.
    pour moi c'est pas là qu'est le plus gros problème... y'a qu'à regarder l'explain plan... l'optimisation c'est pas un exercice qui se fait à l'instinct uniquement

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    oui c aussi long avec le with.
    j'comprend pas ce qui cloche

  6. #26
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par zizou771 Voir le message
    j'comprend pas ce qui cloche
    que tu t'évertues à pas vouloir écouter nos conseils peut-être

  7. #27
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Applique ce que je t'ai dit, teste à nouveau et envoie le plan d'exécution et la requête à chaque nouvelle tentative STP

  8. #28
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    j'applique j'applique, voici la dernière requete avec l'explain plan:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    WITH HC AS 
    (SELECT NUBIX,NUFDP,MHPND,CODEV FROM HISCPN HC1 WHERE NCCOF=7 
    AND DAHIS=(SELECT MAX(HC2.DAHIS) FROM HISCPN HC2 WHERE HC1.NUFDP=HC2.NUFDP AND HC1.NUBIX=HC2.NUBIX AND HC2.NCCOF=7 AND HC2.DAHIS <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON')) ) 
    SELECT to_char(to_date('29/02/2008', 'DD/MM/YYYY'),'YYYYMMDD') "Business day", 
    		'ACOMITY' "REC type", 
    		I.COINT "Legal Entity", 
    		'ACC' "Account description", 
    		HD.NUCPT "Account", 
    		DECODE(C.FSANG,'NET','N','GROSS','G','') "Net/Gross client", 
    		CO.RGCOD "Segregated", 
    		C.RGCOD "Regulatory Code", 
    		C.CRDS "Counterparty", 
    		C.CRDSP "Cost Center", 
    		HC.CODEV "Currency", 
    		'' "deal_id", 
    		'' "int_deal_id", 
    		'' "Product", 
    		'' "Instrument", 
    		'' "Buy/Sell", 
    		'' "Put/Call", 
    		'' "EXC/OTC", 
    		'' "Give-out", 
    		'' "Collateral type", 
    		DECODE(C.HSACT,'O','I','N','E','') "Internal", 
    		ROUND(SUM(HC.MHPND),2) "Amount" 
    FROM INTERV I, HISNEG HN, HISDEP HD, CFLAID C, COMPTE CO, HC
    WHERE I.CTINT='G' AND HD.DATRA <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON') 
    AND HC.MHPND!=0 
    AND HD.COINC=C.COINT AND HD.NUCPT=C.NUCPT (+) AND NOT EXISTS (SELECT 1 FROM INTERV I2 WHERE I2.CTINT='I' AND I2.NUCPT = HD.COINI)
    AND CO.COINT=HD.COINC AND HD.NUCPT=CO.NUCPT AND HN.NUBIX=HD.NUBIX AND HD.NUFDP=HC.NUFDP AND HD.NUBIX=HC.NUBIX AND HN.NUBIX=HC.NUBIX
    GROUP BY 
    		HD.NUCPT ,
    		I.COINT , 
    		DECODE(C.FSANG,'NET','N','GROSS','G','') , 
    		CO.RGCOD, 
    		C.RGCOD, 
    		C.CRDS , 
    		C.CRDSP , 
    		HC.CODEV , 
    		DECODE(C.HSACT,'O','I','N','E','')
    Images attachées Images attachées  

  9. #29
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    t'as pas d'index sur HISCPN.NCCOF ou HISCPN.DAHIS ? Et sur INTERV.CTINT ou INTERV.NUCPT ?

    Il manque encore la jointure :
    je pense aussi que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND HD.DATRA <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON')
    est inutile puisque la condition sur UBIXDAY.Prevday existe déjà dans la recherche du MAX et que tu joins HC avec HD par un index unique apparemment.

    essaye aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND CO.NUCPT =C.NUCPT (+)

  10. #30
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    j'ai rajouté le dernier bout de code.
    En index sur HISCPN & INTERV j'ai ceci:
    Images attachées Images attachées   

  11. #31
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    SELECT to_char(to_date('29/02/2008', 'DD/MM/YYYY'),'YYYYMMDD') "Business day", 
    		'ACOMITY' "REC type", 
    		I.COINT "Legal Entity", 
    		'ACC' "Account description", 
    		HD.NUCPT "Account", 
    		DECODE(C.FSANG,'NET','N','GROSS','G','') "Net/Gross client", 
    		CO.RGCOD "Segregated", 
    		C.RGCOD "Regulatory Code", 
    		C.CRDS "Counterparty", 
    		C.CRDSP "Cost Center", 
    		HC.CODEV "Currency", 
    		'' "deal_id", 
    		'' "int_deal_id", 
    		'' "Product", 
    		'' "Instrument", 
    		'' "Buy/Sell", 
    		'' "Put/Call", 
    		'' "EXC/OTC", 
    		'' "Give-out", 
    		'' "Collateral type", 
    		DECODE(C.HSACT,'O','I','N','E','') "Internal", 
    		HC.MHPND "Amount" 
    FROM INTERV I, HISNEG HN, HISDEP HD, CFLAID C, COMPTE CO, HISCPN HC
    WHERE I.CTINT='G' 
    AND HC.NCCOF=7 
    AND HC.MHPND!=0 
    AND HD.COINC=C.COINT 
    AND CO.COINT=HD.COINC 
    AND HD.NUCPT=C.NUCPT (+) 
    AND HD.NUCPT=CO.NUCPT 
    AND HD.NUFDP=HC.NUFDP 
    AND NOT EXISTS (SELECT 1 FROM INTERV I2 WHERE I2.CTINT='I' AND I2.NUCPT = HD.COINI)
    AND HN.NUBIX=HD.NUBIX 
    AND HD.NUBIX=HC.NUBIX 
    AND HN.NUBIX=HC.NUBIX
    AND HC.DAHIS=(SELECT MAX(DAHIS) 
    				FROM HISCPN  
    			   WHERE HC.NUFDP=NUFDP 
    			 	 AND HC.NUBIX=NUBIX 
    				 AND NCCOF=7 
    				 AND DAHIS <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON'))
    Et en ajoutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND CO.NUCPT=C.NUCPT (+)

  12. #32
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par zizou771 Voir le message
    j'ai rajouté le dernier bout de code.
    En index sur HISCPN & INTERV j'ai ceci:
    pour HISCPN ça devrait être suffisant par contre sur INTERV il manque peut-être un index sur CTINT,NUCPT (ajoute NUCPT à INTERV2)

  13. #33
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    je n'ai pas mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND CO.NUCPT=C.NUCPT (+)
    car cela me sort une erreur de jointure.

    voici l'explain plan:
    Images attachées Images attachées  

  14. #34
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Ajoute l'index sur INTERV, il est là ton problème.

  15. #35
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    mais INTERV ne me sert qu'as rajouté un seul champs. Si je le zappe le pb est toujours présent. Je viens de lancer cette requête qui est aussi long:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    SELECT to_char(to_date('29/02/2008', 'DD/MM/YYYY'),'YYYYMMDD') "Business day", 
    		'ACOMITY' "REC type", 
    	--	I.COINT "Legal Entity", 
    		'ACC' "Account description", 
    		HD.NUCPT "Account", 
    		DECODE(C.FSANG,'NET','N','GROSS','G','') "Net/Gross client", 
    		CO.RGCOD "Segregated", 
    		C.RGCOD "Regulatory Code", 
    		C.CRDS "Counterparty", 
    		C.CRDSP "Cost Center", 
    		HC.CODEV "Currency", 
    		'' "deal_id", 
    		'' "int_deal_id", 
    		'' "Product", 
    		'' "Instrument", 
    		'' "Buy/Sell", 
    		'' "Put/Call", 
    		'' "EXC/OTC", 
    		'' "Give-out", 
    		'' "Collateral type", 
    		DECODE(C.HSACT,'O','I','N','E','') "Internal", 
    		HC.MHPND "Amount" 
    FROM --INTERV I,
     HISNEG HN, HISDEP HD, CFLAID C, COMPTE CO, HISCPN HC
    WHERE --I.CTINT='G' AND 
    HC.NCCOF=7 
    AND HC.MHPND!=0 
    AND HD.COINC=C.COINT 
    AND CO.COINT=HD.COINC 
    AND HD.NUCPT=C.NUCPT (+) 
    AND HD.NUCPT=CO.NUCPT 
    AND HD.NUFDP=HC.NUFDP 
    AND NOT EXISTS (SELECT 1 FROM INTERV I2 WHERE I2.CTINT='I' AND I2.NUCPT = HD.COINI)
    AND HN.NUBIX=HD.NUBIX 
    AND HD.NUBIX=HC.NUBIX 
    AND HN.NUBIX=HC.NUBIX
    AND HC.DAHIS=(SELECT MAX(DAHIS) 
    				FROM HISCPN  
    			   WHERE HC.NUFDP=NUFDP 
    			 	 AND HC.NUBIX=NUBIX 
    				 AND NCCOF=7 
    				 AND DAHIS <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON'))
    Images attachées Images attachées  

  16. #36
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    En effet, j'avais pas vu que l'index sur HISCPN n'est pas correct... tu dois mettre DAHIS en dernier pour pouvoir l'utiliser dans la jointure avec HISNEG

    Pour avancer tu dois trouver et traiter les FULL TABLE SCAN

  17. #37
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    ah c'est beaucoup mieux en effet...merci
    Mais pourquoi le mettre en dernier?
    Et je peux pas créer un dexieme index NUBIX, NUFDP, DAHIS en + de DAHIS, NUBIX, NUFDP

  18. #38
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    parce que l'index est sur : DAHIS, NUBIX, NUCPT et que tu n'utilises que les 2 dernières colonnes. Or l'arbre de l'index commence sur DAHIS ce qui évidemment n'arrange pas les affaires d'Oracle. Aparemment NUBIX, NUCPT ont une signification fonctionnel forte, alors il faut les mettres en 1°. Si tu fais des accès sur DAHIS uniquement dans d'autres requêtes alors il faut que tu crées un index à part pour lui

    ça ressemble à quoi maintenant avec ta requête initiale plus les jointures que je t'ai fait ajouter ? Avec le NOT IN et avec le NOT EXISTS ?

  19. #39
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    Et je peux créer un 2nd index NUBIX, NUFDP, DAHIS en + de DAHIS, NUBIX, NUFDP, ca cause pas de pb?

    voila l'explain plan:
    Images attachées Images attachées  

  20. #40
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par zizou771 Voir le message
    Et je peux créer un 2nd index NUBIX, NUFDP, DAHIS en + de DAHIS, NUBIX, NUFDP, ca cause pas de pb?

    voila l'explain plan:
    bah c'est nul

    Tu crées 2 mêmes indexes avec juste l'ordre qui change, c'est idéal pour perdre le CBO... pourquoi pas : (NUBIX, NUFDP, DAHIS) et DAHIS seul ? Ou même (NUBIX, NUFDP) + DAHIS

    T'as toujours ton FTS sur HISCPN ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. performance des index sur une requete
    Par Invité dans le forum SQL
    Réponses: 2
    Dernier message: 27/04/2010, 20h29
  2. [A-00] pb de calcul sur une requete simple
    Par secretaire59 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/10/2008, 10h50
  3. bloquage sur une requete pourtant simple
    Par mdr_cedrick dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/04/2008, 15h55
  4. DBexpress, Simple requete sur server MySql
    Par Ice-tea dans le forum Bases de données
    Réponses: 7
    Dernier message: 02/06/2006, 14h57
  5. Question performance sur requetes sql
    Par shinrei dans le forum ASP
    Réponses: 7
    Dernier message: 19/05/2006, 13h28

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