Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/03/2007, 11h12   #1
Nouveau Membre du Club
 
Homme
Développeur informatique
Inscription : octobre 2002
Messages : 64
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2002
Messages : 64
Points : 27
Points : 27
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 :
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 :
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
bguihal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2007, 13h47   #2
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

Je pense que tu as oublié une parenthèse avant
Code :
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 :
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
           )
       )
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2007, 14h01   #3
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour ,

Code :
1
2
WHERE 
cond1 AND cond2 AND cond3 AND ( cond4 OR cond5)
n'est pas equivalent

Code :
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.
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h12.


 
 
 
 
Partenaires

Hébergement Web