Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 18/05/2011, 18h41   #1
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Par défaut Performance d'une requête

salut à tous,

Voilà j'ai une autre requête que je voudrais optimiser :

Code :
1
2
3
4
5
6
UPDATE tab1 SET
FLAG_CLIENT = w_client
, FLAG_LIGNE = (SELECT case when w_client > FLAG_LIGNE then w_client else FLAG_LIGNE end FROM dual)
WHERE STATUS = 'NEW'
AND FLAG_EQUILIBRE = '0'
AND NOT EXISTS ( SELECT 'x' FROM tab2 WHERE tab2.CLIENT = substr(LIGNE_ME,1,16))
J'ai créé 2 indexes sur tab1 :

- le premier avec (status ,FLAG_EQUILIBRE)
- le second avec (substr(LIGNE_ME,1,16))

et sur tab2 :
- un index sur (CLIENT ).

Qu'est ce que vous en pensez?
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 19h07   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 434
Points : 10 434
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Pourquoi cette requête sur DUAL ?
Code :
1
2
3
4
5
6
7
8
UPDATE tab1
   SET FLAG_CLIENT    = w_client
     , FLAG_LIGNE     = greatest(w_client, FLAG_LIGNE)
 WHERE STATUS         = 'NEW'
   AND FLAG_EQUILIBRE = '0'
   AND NOT EXISTS (SELECT NULL
                     FROM tab2
                    WHERE tab2.CLIENT = substr(LIGNE_ME, 1, 16));
Quant aux index, ça peut améliorer, ça peut dégrader, ça peut ne rien changer.
Ça dépend de vos données.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 18/05/2011, 19h42   #3
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Merci pour le "greatest" je ne connaissais pas!!

Sinon, la table tab1 et tab2 ont plus de 1 millions de lignes (tab1 varie de 200 000 jusqu'à 2,5 millions et la table tab2 ne varie pas trop 1,4 millions )
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 11h20   #4
Membre expérimenté
 
Avatar de NicoL__
 
Homme Nicolas
Inscription : janvier 2011
Messages : 378
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations forums :
Inscription : janvier 2011
Messages : 378
Points : 528
Points : 528
A ma connaissance il oracle utilise 1 index par table et par requête. Tu peux vérifier le plan d'exécution dans Toad.
Mais à priori un index avec les 3 champs est peut être mieux, si oracle l'utilise.
Par contre il ne vaut mieux pas mettre d'index sur FLAG_CLIENT et FLAG_LIGNE car je pense que ça serait pénalisant.
NicoL__ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 11h37   #5
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Comment je pourrais voir le plan d’exécution de la requête dans toad?
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 11h55   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Attention Waldar, ton code n'est pas identique, tu ne gères pas les NULL
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
WITH t AS (SELECT 10 AS flag_ligne FROM dual),
w AS (SELECT 1 w_client FROM dual 
UNION SELECT 20 FROM dual
UNION SELECT NULL FROM dual)
SELECT flag_ligne, w_client,
	(SELECT CASE WHEN w_client > FLAG_LIGNE THEN w_client ELSE FLAG_LIGNE END FROM dual) res,
	GREATEST(w_client, FLAG_LIGNE) great,
	NVL(GREATEST(w_client, FLAG_LIGNE), FLAG_LIGNE) ok
FROM t, w
 
FLAG_LIGNE	W_CLIENT	RES	GREAT		OK
10		1		10	10		10
10		20		20	20		20
10		(NULL)		10	(NULL)		10
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/05/2011, 12h00   #7
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Merci, mais Les FLAG ne sont jamais à NULL, ni les Variables w_...

Très bonne remaque sinon!!
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 13h34   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Citation:
Envoyé par AbouZaid Voir le message
Comment je pourrais voir le plan d’exécution de la requête dans toad?
Dans Toad, c'est l'icône de l'ambulance. Tu surlignes ta requête et tu cliques sur l'ambulance (ou menu Database / Optimize / Explain Plan).
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 17h36   #9
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Merci c'est bon j'ai trouvé comment la faire.

Mais dans la requête j'ai :
Code :
1
2
...
WHERE substr(Ligne,1,1) <> 'G'
et mon index est sur substr(Ligne,1,1), mais le problème c'est qu'il n'utilise pas l'index si dans le where j'ai '<>' au lieu de '='!!

Y a t il moyen de faire autrement?
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 10h19   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
T'as combien de ligne avec G par rapport au nombre de lignes totales ? Parce que si tu ramènes beaucoup de lignes, c'est normal qu'Oracle n'utilise pas l'index, ce serait une perte de temps

Sinon, pour mon info , un index normal ne suffirait-il pas puisque c'est la première lettre que tu cherches ?


Citation:
Envoyé par AbouZaid Voir le message
Mais dans la requête j'ai :
Code :
1
2
...
WHERE substr(Ligne,1,1) <> 'G'
Et c'est confidentiel défense ou tu peux nous mettre la requête en entier ? Parce que ça on l'a pas dans ton post de départ
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 11h12   #11
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
bonjour,

et bien j'ai enormement de requêtes avec
Code :
WHERE substr(Ligne,1,1) <> 'G'
Sinon pour le nombre de lignes, en général ce sont les 'G' qui dominent!

Voici un des requêtes que je voudrais optimiser :
Code :
1
2
3
4
5
6
7
UPDATE Tab1 SET
  FLAG_PCEC = w_CTRL_PCEC
, FLAG_LIGNE = greatest( w_CTRL_PCEC, FLAG_LIGNE)
WHERE STATUS = 'NEW'
AND    substr(LIGNE_ME,1,1) <> 'G'
AND    PCEC IS NULL
AND    length(ltrim(rtrim(substr(LIGNE_ME,1,16)))) <> 7
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 11h21   #12
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Une autre requête qui prend 5 min sur 2 millions de lignes :

Code :
1
2
3
4
5
6
UPDATE TABLE SET
   JOURNAL = 'JOURNAL_AUTRE'
,  FLAG_JOURNAL = w_CTRL_JOURNAL
,  FLAG_LIGNE = greatest(w_CTRL_JOURNAL,FLAG_LIGNE)
WHERE STATUS = 'NEW'
AND  JOURNAL = 'JOURNAL_0';
sachant qu'il ya un index sur la table sur les colonnes ( STATUS, JOURNAL)!!!
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 11h35   #13
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Faudrait une trace pour savoir où le temps passe
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 11h38   #14
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
trace sur toad? sqlplus?
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 11h40   #15
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
il serait interessant que vous postiez les plans d'execution de vos requetes, ainsi que le descriptif complet de vos indexes.

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 11h43   #16
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Si vous pouviez m'aider pour le faire.

J'ai cherché et trouvé comment faire un plan d’exécution de ma requête, mais pourriez vous me dire quelles champs afficher de la table PLAN_TABLE?
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 11h53   #17
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Merci de faire une recherche dans les tutos, tout y est expliqué
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 12h33   #18
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Au moins les ordres de creation de vos indexes, cela permettra de comprendre un peu ce qui se passe... Le plan d'execution serait le top, car il permettra de verifier les differentes suppositions.

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 13h05   #19
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Voilà :

Code :
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
SQL>  UPDATE INTERFACE
  2  SET JOURNAL = 'CIH_AUTRE'
  3   WHERE FLAG_JOURNAL <> '0'
  4      AND STATUS ='TRANSFERED';
 
817787 ligne(s) mise(s) à jour.
 
Ecoulé : 00 :02 :39.97
 
Plan d exécution
----------------------------------------------------------
   0      UPDATE STATEMENT Optimizer=ALL_ROWS (Cost=75582 Card=913097
          Bytes=21001231)
 
   1    0   UPDATE OF 'INTERFACE'
   2    1     TABLE ACCESS (FULL) OF 'INTERFACE' (TABLE) (Cost=
          75582 Card=913097 Bytes=21001231)
 
 
 
 
 
Statistiques
----------------------------------------------------------
        187  recursive calls
    1343222  db block gets
    1369995  consistent gets
     786279  physical reads
  286278872  redo size
        371  bytes sent via SQL*Net TO client
        387  bytes received via SQL*Net FROM client
          3  SQL*Net roundtrips TO/FROM client
          1  sorts (memory)
          0  sorts (disk)
     817787  rows processed
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 14h43   #20
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
et vous avez des indexes de créés ??
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh 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 14h48.


 
 
 
 
Partenaires

Hébergement Web