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

Oracle Discussion :

Optimisations d'une requete


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 72
    Par défaut Optimisations d'une requete
    J'ai une req sql qui dure environ 13 sec, j'ai tout un tas de paramètres qui sont aléatoires (pas de logique ou sélectioné par l'utilisateur). les paramètres sont tous les "or".
    Ma question est :
    Quand j'ai 50 paramètres --> 1sec
    Quand j'ai 200 paramètres --> 12sec
    Quand j'ai 1000 paramètres --> 10min

    le problème c'est que ce n'est pas du tout linéaire.

    j'ai essayer avec des in (mais on est limité a 1000 et c'était + lent)
    j'ai essayer avec une table tempo (mais c'était + lent)
    j'ai essayer en remaniant ma req (mais elle faisait 7000 lignes et c'était encor + lent)

    la req est


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select doc_detail_nomenclature.id|| ',' 
    ||doc_detail_nomenclature.sens || ','  ||  nelement from 
    doc_detail_nomenclature,doc_detail_sens, doc_detail where 
    doc_detail_nomenclature.sens=doc_detail_sens.sens   and 
    doc_detail_nomenclature.id=doc_detail_sens.id  and 
    doc_detail.id=doc_detail_sens.id and ( (doc_detail.id = 412406 or 
    doc_detail.id =484099 or doc_detail.id =502826 or doc_detail.id =505618 or 
    doc_detail.id =512470 or doc_detail.id =524879 or doc_detail.id =527549 ... ) 
    and n_reseau<>8) or  ((doc_detail.id = 412406 or doc_detail.id =484099 or 
    doc_detail.id =502826 or doc_detail.id =505618 or doc_detail.id =512470 ...) 
    and n_reseau=8 and n_type_prod_etab=7)
    Le plan est
    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
    Plan
    SELECT STATEMENT  CHOOSECost: 193,661,550  Bytes: 10,011,063,097,623  Cardinality: 476,717,290,363  					
    	15 CONCATENATION  				
    		8 MERGE JOIN CARTESIAN  Cost: 227  Bytes: 7,755,540  Cardinality: 517,036  			
    			5 MERGE JOIN CARTESIAN  Bytes: 5,382,150  Cardinality: 538,215  		
    				2 INLIST ITERATOR  	
    					1 INDEX RANGE SCAN NON-UNIQUE ADV_DEV_CDE.IDX2_DOC_DETAIL Cost: 4  Bytes: 1,236  Cardinality: 206  
    				4 BUFFER SORT  Bytes: 5,382,150  Cardinality: 538,215  	
    					3 INDEX FAST FULL SCAN NON-UNIQUE ADV_DEV_CDE.IDX8_DOC_DETAIL_NOMENCLATURE Cost: 227  Bytes: 5,382,150  Cardinality: 538,215  
    			7 BUFFER SORT  Bytes: 5  Cardinality: 1  		
    				6 INDEX FAST FULL SCAN UNIQUE ADV_DEV_CDE.PK_ID_SENS Bytes: 5  Cardinality: 1  	
    		14 HASH JOIN  Cost: 233  Bytes: 22,428  Cardinality: 1,068  			
    			10 INLIST ITERATOR  		
    				9 INDEX RANGE SCAN NON-UNIQUE ADV_DEV_CDE.IDX2_DOC_DETAIL Cost: 4  Bytes: 1,236  Cardinality: 206  	
    			13 NESTED LOOPS  Cost: 227  Bytes: 7,755,540  Cardinality: 517,036  		
    				11 INDEX FAST FULL SCAN NON-UNIQUE ADV_DEV_CDE.IDX8_DOC_DETAIL_NOMENCLATURE Cost: 227  Bytes: 5,382,150  Cardinality: 538,215  	
    				12 INDEX UNIQUE SCAN UNIQUE ADV_DEV_CDE.PK_ID_SENS Bytes: 5  Cardinality: 1
    La j'ai mis une requete avec 200 param soit 12 sec, le cost est de 193,661,550 comment est il possible qu'il prenne si peu de temps alors qu'il y a autant de cost ? Et surtout comment peut on optimisé cela ?


    ps : Je suis sur une base oracle 9i

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Bonjour,

    Je pense que tu as oublié une parenthèse avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ( (doc_detail.id = 412406 OR 
    doc_detail.id =484099 OR doc_detail.id =502826 OR doc_detail.id =505618 OR 
    doc_detail.id =512470 OR doc_detail.id =524879 OR doc_detail.id =527549 ... ) 
    AND n_reseau<>8) 
    OR  ((doc_detail.id = 412406 OR doc_detail.id =484099 OR 
    doc_detail.id =502826 OR doc_detail.id =505618 OR doc_detail.id =512470 ...) 
    AND n_reseau=8 AND n_type_prod_etab=7)
    essayes ce code le code suivant
    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
    SELECT    doc_detail_nomenclature.ID
           || ','
           || doc_detail_nomenclature.sens
           || ','
           || nelement
      FROM doc_detail_nomenclature, doc_detail_sens, doc_detail
     WHERE doc_detail_nomenclature.sens = doc_detail_sens.sens
       AND doc_detail_nomenclature.ID = doc_detail_sens.ID
       AND doc_detail.ID = doc_detail_sens.ID
       AND (   (    doc_detail.ID IN
                         (412406, 484099, 502826, 505618, 512470, 524879, 527549)
                AND n_reseau <> 8
               )
            OR (    doc_detail.ID IN (412406, 484099, 502826, 505618, 512470)
                AND n_reseau = 8
                AND n_type_prod_etab = 7
               )
           )

  3. #3
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Bonjour ,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where 
    cond1 and cond2 and cond3 and ( cond4 or cond5)
    n'est pas equivalent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where 
    cond1 and cond2 and cond3 and cond4 or cond5
    la syntaxe de cette dernière qui provoque le produit cartésien et rend la requette plus lente.

Discussions similaires

  1. Optimisation d'une requete "TOP 5"
    Par gregb34 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/05/2006, 18h17
  2. Réponses: 5
    Dernier message: 14/04/2006, 19h58
  3. Optimisation d'une requete récurrente
    Par winzou dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 23/01/2006, 23h07
  4. Optimisation d'une requete specifique
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 9
    Dernier message: 16/12/2005, 15h14
  5. optimisation d'une requete de recherche
    Par moog dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 06/04/2005, 17h58

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