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 21/12/2007, 14h25   #1
Membre du Club
 
Inscription : septembre 2006
Messages : 111
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 111
Points : 68
Points : 68
Par défaut Requête qui prend des plombes

Bonjour

J'essaye de faire une requete pas tres compliquée, mais sur 2M de lignes, ce qui fait qu'elle prend beaucoup de temps.

J'ai donc comme requête :

Code :
1
2
3
4
5
6
7
8
9
10
SELECT   t.code_entrep,
         p.code_qual,
         p.n_num_quantite,
         t.date_mep
    FROM table_stockage t JOIN quantite p ON (t.code_commun = p.code_commun)
   WHERE t.date_mep = (SELECT MAX (date_mep)
                              FROM table_stockage t2
                             WHERE t2.code_entrep = t.code_entrep
                               AND t2.code_produit = t.code_produit)
ORDER BY code_entrep;
J'ai ajouté un index sur ma table table_stockage sur les colonnes code_entrep et code_produit


Et comme plan d'execution j'obtiens

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
------------------------------------------------------------------------------------------
| Id  | Operation                      |  Name                   | Rows  | Bytes | Cost  |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                         | 20110 |  1060K|  2084 |
|   1 |  SORT ORDER BY                 |                         | 20110 |  1060K|  2084 |
|   2 |   FILTER                       |                         |       |       |       |
|   3 |    HASH JOIN                   |                         | 20110 |  1060K|  1867 |
|   4 |     TABLE ACCESS FULL          | QUANTITE                    |   629 | 10693 |     2 |
|   5 |     TABLE ACCESS FULL          | TABLE_STOCKAGE      | 19662 |   710K|  1863 |
|   6 |    SORT AGGREGATE              |                         |     1 |    18 |       |
|   7 |     TABLE ACCESS BY INDEX ROWID| TABLE_STOCKAGE      |     1 |    18 |     2 |
|   8 |      INDEX RANGE SCAN          | TABLE_STOCKAGE_IND  |     1 |       |     1 |
------------------------------------------------------------------------------------------

Merci pour votre aide
Kiroukool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 14h32   #2
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
y'a-til un index sur code_commun de quantité ?
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 14h33   #3
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Ouais... encore le jeu "devine la version d'Oracle et les indexes sur les tables"... j'adore

Commençons par le plus évident
Ceci ne ferait-il pas l'affaire :

Code :
1
2
3
4
5
6
SELECT   t.code_entrep,
         p.code_qual,
         p.n_num_quantite,
         MAX(t.date_mep)
    FROM table_stockage t JOIN quantite p ON (t.code_commun = p.code_commun)
GROUP BY code_entrep,code_qual,n_num_quantite;
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 14h34   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par LeoAnderson Voir le message
y'a-til un index sur code_commun de quantité ?
et un autre sur date_mep

Je dirais que là y'en a un sur code_commun mais de table_stockage
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 14h37   #5
Membre du Club
 
Inscription : septembre 2006
Messages : 111
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 111
Points : 68
Points : 68
Non il n'y en avait pas.

J'ai essayé en en rajoutant un, mais c'est toujours tres long
Kiroukool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 14h40   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
t'as calculé les stats ? Et puis c'est confidentielle la version et la liste des indexes ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 14h47   #7
Membre du Club
 
Inscription : septembre 2006
Messages : 111
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 111
Points : 68
Points : 68
Citation:
Envoyé par orafrance Voir le message
Ouais... encore le jeu "devine la version d'Oracle et les indexes sur les tables"... j'adore

Commençons par le plus évident
Ceci ne ferait-il pas l'affaire :

Code :
1
2
3
4
5
6
SELECT   t.code_entrep,
         p.code_qual,
         p.n_num_quantite,
         MAX(t.date_mep)
    FROM table_stockage t JOIN quantite p ON (t.code_commun = p.code_commun)
GROUP BY code_entrep,code_qual,n_num_quantite;
Non ca ne fait pas l'affaire car ca me récupère tous les t.code_entrep,
p.code_qual,
p.n_num_quantite de toutes les lignes ou j'ai une date_mep.

Je veux juste récupèrer ces valeurs la pour la derniere date_mep de chaque enregistrement
Kiroukool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 14h48   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
J'AI DEMANDE LA VERSION DE LA BASE !!!!
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 14h55   #9
Membre du Club
 
Inscription : septembre 2006
Messages : 111
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 111
Points : 68
Points : 68
Version d'oracle

oracle 9i 9.2.0.6.0

Les index existants sur les tables utilisées sont

1) sur quantite :

une primary key sur un champs qui n'est pas utilisé ici
un index sur code_qual
un index sur n_num_quantite

2) sur table_stockage :

juste deux index sur code_entrep et code_produit


Edit : du calme...
Kiroukool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 14h59   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
donc tu n'as ni d'index sur quantité.code_commun suggéré par léo ni sur table_stockage.date_mep que j'ai proposé... j'ai pas l'impression d'écrire à un robot c'est très agréable
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 15h05   #11
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
en tout cas, t'as pas d'index sur les colonnes qui servent à faire les jointures alors faut pas s'étonner que ça rame
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 15h08   #12
Membre du Club
 
Inscription : septembre 2006
Messages : 111
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 111
Points : 68
Points : 68
Lis mes posts j'ai rajouté un des deux index mais ca n'a rien changé...

Je rajoute celui que tu as suggéré et je vous tiens au courant.

Inutile de t'ennerver comme ca
Kiroukool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 15h13   #13
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
essaye de mettre des index sur :
p.code_commun
t.date_mep
(t.code_entrep,t.code_produit)

On te mache le boulot mais t'es pas fichu de tester convenablement en nous donnant les nouveaux plans d'exécution et aussi en répondant aux questions (je n'ai toujours pas l'assurance que tu as calculé les stats convenablement )

Merci donc de faire un minimum d'effort
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 15h42   #14
Membre du Club
 
Inscription : septembre 2006
Messages : 111
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 111
Points : 68
Points : 68
Citation:
Envoyé par orafrance Voir le message
essaye de mettre des index sur :
p.code_commun
t.date_mep
(t.code_entrep,t.code_produit)

On te mache le boulot mais t'es pas fichu de tester convenablement en nous donnant les nouveaux plans d'exécution et aussi en répondant aux questions (je n'ai toujours pas l'assurance que tu as calculé les stats convenablement )

Merci donc de faire un minimum d'effort
C'est pas ca mais je suis une quiche en base de données et je suis au boulot je fais d'autres choses. Alors je vais mettre les index que tu suggères et vous redonner le plan d'execution. Je n'ai pas fait de calculs de stats tout simplement car je ne sais pas


Voila j'ai retesté avec ces index et ca va deja plus vite sans le order by (environ une minute). Par contre avec le order by ca prend toujours beaucoup de temps.


Voici le plan d'execution :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 ------------------------------------------------------------------------------------------
| Id  | Operation                      |  Name                   | Rows  | Bytes | Cost  |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                         | 20110 |  1060K|  1477 |
|   1 |  SORT ORDER BY                 |                         | 20110 |  1060K|  1477 |
|   2 |   FILTER                       |                         |       |       |       |
|   3 |    TABLE ACCESS BY INDEX ROWID | TABLE_STOCKAGE      |    32 |  1184 |     2 |
|   4 |     NESTED LOOPS               |                         | 20110 |  1060K|  1260 |
|   5 |      TABLE ACCESS FULL         | QUANTITE                    |   629 | 10693 |     2 |
|   6 |      INDEX RANGE SCAN          | CODE_COMMUN_IND           |  7788 |       |     1 |
|   7 |    SORT AGGREGATE              |                         |     1 |    18 |       |
|   8 |     TABLE ACCESS BY INDEX ROWID| TABLE_STOCKAGE      |     1 |    18 |     2 |
|   9 |      INDEX RANGE SCAN          | TABLE_STOCKAGE_IND  |     1 |       |     1 |
------------------------------------------------------------------------------------------
Kiroukool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 15h50   #15
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
t'as fait l'index de code_commun sur la table quantité ?

Si c'est le cas, essaye ceci :

Code :
SELECT   /*+ index(p,p_index) */ t.code_entrep,
en remplaçant p_index par le nom de l'index. Peut-tu nous communiquer la valeur de paramètre SORT_AREA_SIZE et PGA_AGGREGATE_TARGET STP ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 15h58   #16
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
essaye ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT   t.code_entrep,
         p.code_qual,
         p.n_num_quantite,
	 t.date_mep
    FROM (
	     SELECT code_entrep, 
		        code_commun,
		        date_mep,
                MAX(t.date_mep) OVER (PARTITION BY t.code_entrep,t.code_produit) max_date 
		   FROM table_stockage
		  ) t JOIN quantite p ON (t.code_commun = p.code_commun)
   WHERE t.date_mep = t.max_date 
ORDER BY code_entrep;
si ça ne marche pas merci de nous donner l'ordre de création des tables ainsi que quelques lignes dans chacune d'elle pour tester la syntaxe
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2007, 17h10   #17
Membre du Club
 
Inscription : septembre 2006
Messages : 111
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 111
Points : 68
Points : 68
Je n'ai pas les droits d'admin pour voir ces parametres...

quand a la requete sur le select index, elle ne fonctionne pas
Kiroukool 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 11h31.


 
 
 
 
Partenaires

Hébergement Web