Requete trop longue!

Résolu/Fermé
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 - 15 févr. 2010 à 14:29
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 - 18 févr. 2010 à 09:12
Bonjour,

dans un de mes codes j'effectue une requête SQL, mais celle-ci mets plus de 3 min à s'exécuter!
j'aimerais savoir si il y'a des astuces pour réduire le temps de celle-ci?

Si je la met dans le message personne n'osera la lire :S
Elle utilise des inner join, select null, structure...
Est ce que certaine de ces fonctions prennent plus de temps que les autres?

Merci d'avance!

10 réponses

PRO_PHP Messages postés 95 Date d'inscription jeudi 11 février 2010 Statut Membre Dernière intervention 27 avril 2010 1
15 févr. 2010 à 18:36
vue que je ne vois pas ta reque c'est difficile a savoir mais moi j'opterai pour une procédure stocké!!
C'est plus rapide et ta moin de chance que ca plante...
0
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 311
16 févr. 2010 à 08:59
La requete la voilà, elle est pas très bien formatté désolé ^^

select
CODEFILS, CODEEXTERNEFILS, CODEPERE, CODE_GP, CODE_DPT, CODEEXTERNEPERE, MONTANT, LIBELLE
from (
select
ROWNUM as RNUM, CODEFILS, CODEEXTERNEFILS, CODEPERE, CODE_GP, CODE_DPT, CODEEXTERNEPERE, MONTANT, LIBELLE
from (
SELECT NULL AS codefils, NULL AS codeexternefils,
nmc_ue_cdnmccmr AS codepere, nmc_gp_cdnmccmr AS code_gp,
nmc_dpt_cdnmccmr AS code_dpt, nmc_ue_cdextnmccmr AS codeexternepere,
SUM (DECODE (orvalmnt, 'C', vlmntmvt, -vlmntmvt)) AS montant,
nmc_ue_lbnmccmr AS libelle
FROM (SELECT nmc_dpt.cdresdis nmc_dpt_cdresdis,
nmc_fam.cdnmccmr nmc_fam_cdnmccmr,
nmc_ue.cdstrnmccmr nmc_ue_cdstrnmccmr,
nmc_ue.cdextnmccmr nmc_ue_cdextnmccmr,
nmc_gp.cdextnmccmr nmc_gp_cdextnmccmr,
nmc_dpt.cdextnmccmr nmc_dpt_cdextnmccmr,
nmc_gp.cdnmccmr nmc_gp_cdnmccmr,
nmc_dpt.cdnmccmr nmc_dpt_cdnmccmr,
nmc_ue.lbnmccmr nmc_ue_lbnmccmr,
nmc_ue.cdnmccmr nmc_ue_cdnmccmr
FROM rgxtnmc nmc_mag INNER JOIN rgxthnm hnm_mag_dpt ON hnm_mag_dpt.cdnmccmrfll =
nmc_mag.cdnmccmr
AND ( ( hnm_mag_dpt.dtfinlienmc IS NOT NULL
AND TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
BETWEEN hnm_mag_dpt.dtdeblienmc
AND hnm_mag_dpt.dtfinlienmc
)
OR ( hnm_mag_dpt.dtfinlienmc IS NULL
AND TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
) >=
hnm_mag_dpt.dtdeblienmc
)
)
INNER JOIN rgxtnmc nmc_dpt ON nmc_dpt.cdnmccmr =
hnm_mag_dpt.cdnmccmr
AND nmc_dpt.cdresdis = 8
AND ( ( nmc_dpt.dtfinacvnmc IS NULL
OR (nmc_dpt.dtfinacvnmc >=
TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
)
)
AND (nmc_dpt.dtdebacvnmc <=
TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
)
)
INNER JOIN rgxthnm hnm_dpt_gp ON hnm_dpt_gp.cdnmccmrfll =
nmc_dpt.cdnmccmr
AND ( ( hnm_dpt_gp.dtfinlienmc IS NOT NULL
AND TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
BETWEEN hnm_dpt_gp.dtdeblienmc
AND hnm_dpt_gp.dtfinlienmc
)
OR ( hnm_dpt_gp.dtfinlienmc IS NULL
AND TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
) >=
hnm_dpt_gp.dtdeblienmc
)
)
INNER JOIN rgxtnmc nmc_gp ON nmc_gp.cdnmccmr =
hnm_dpt_gp.cdnmccmr
AND ( ( nmc_gp.dtfinacvnmc IS NULL
OR (nmc_gp.dtfinacvnmc >=
TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
)
)
AND (nmc_gp.dtdebacvnmc <=
TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
)
)
INNER JOIN rgxthnm hnm_gp_ue ON hnm_gp_ue.cdnmccmrfll =
nmc_gp.cdnmccmr
AND ( ( hnm_gp_ue.dtfinlienmc IS NOT NULL
AND TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
BETWEEN hnm_gp_ue.dtdeblienmc
AND hnm_gp_ue.dtfinlienmc
)
OR ( hnm_gp_ue.dtfinlienmc IS NULL
AND TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
) >=
hnm_gp_ue.dtdeblienmc
)
)
INNER JOIN rgxtnmc nmc_ue ON nmc_ue.cdnmccmr =
hnm_gp_ue.cdnmccmr
AND nmc_ue.cdstrnmccmr = 2
AND ( ( nmc_ue.dtfinacvnmc IS NULL
OR (nmc_ue.dtfinacvnmc >=
TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
)
)
AND (nmc_ue.dtdebacvnmc <=
TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
)
)
INNER JOIN rgxthnm hnm_ue_fam ON hnm_ue_fam.cdnmccmrfll =
nmc_ue.cdnmccmr
AND ( ( hnm_ue_fam.dtfinlienmc IS NOT NULL
AND TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
BETWEEN hnm_ue_fam.dtdeblienmc
AND hnm_ue_fam.dtfinlienmc
)
OR ( hnm_ue_fam.dtfinlienmc IS NULL
AND TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
) >=
hnm_ue_fam.dtdeblienmc
)
)
INNER JOIN rgxtnmc nmc_fam ON nmc_fam.cdnmccmr =
hnm_ue_fam.cdnmccmr
AND ( ( nmc_fam.dtfinacvnmc IS NULL
OR (nmc_fam.dtfinacvnmc >=
TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
)
)
AND (nmc_fam.dtdebacvnmc <=
TO_TIMESTAMP
('08/01/2010',
'dd/MM/yyyy'
)
)
)
) STRUCTURE,
(SELECT *
FROM rgxtmvc mvc
WHERE mvc.cdmagdis = 4264
AND mvc.dtjurcpt = TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy')
AND mvc.cdtypmvt IN (100,102,110,111)) mvc
--,rgxtetn etn
WHERE STRUCTURE.nmc_fam_cdnmccmr = mvc.cdnmccmr(+)
AND NOT EXISTS (
SELECT *
FROM rgxtetn etn
WHERE ( ( etn.dtfinlieeat IS NOT NULL
AND TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy')
BETWEEN etn.dtdebeatnmc
AND etn.dtfinlieeat
)
OR ( etn.dtfinlieeat IS NULL
AND TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy') >=
etn.dtdebeatnmc
)
)
AND etn.cdeatobjrgx IN (10,12)
AND ( etn.cdnmccmr = STRUCTURE.nmc_dpt_cdnmccmr
OR etn.cdnmccmr = STRUCTURE.nmc_gp_cdnmccmr
OR etn.cdnmccmr = STRUCTURE.nmc_ue_cdnmccmr
))
GROUP BY nmc_ue_cdnmccmr,
nmc_ue_cdextnmccmr,
nmc_ue_lbnmccmr,
nmc_dpt_cdnmccmr,
nmc_dpt_cdextnmccmr,
nmc_gp_cdnmccmr,
nmc_gp_cdextnmccmr
ORDER BY nmc_ue_cdextnmccmr ASC
) where ROWNUM <= 8 )
where RNUM > 0;
0
blux Messages postés 25976 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 avril 2024 3 287
16 févr. 2010 à 12:28
Salut,

c'est sur quel SGBD ?

Je vois beaucoup de select * dans les sous-requêtes, as-tu besoin de tous les champs ?
0
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 311
16 févr. 2010 à 13:12
C'est sous oracle!
Et pour les select * c'est en effet cet partie la de la requete qui prend beaucoup de temps...
Etant donné que c'est pas moi qui l'ai faite en entier, je galère un peu a voir ce qui est utile ou pas...
Mais je continue d'essayer d'approfondir!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blux Messages postés 25976 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 avril 2024 3 287
16 févr. 2010 à 13:13
Que dit un EXPLAIN ?
0
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 311
16 févr. 2010 à 13:39
J'arrive pas à faire un explain avec SQL Developer, je fais ca:

EXPLAIN PLAN FOR
Ma requete

Et ca me sors une erreur...
0
blux Messages postés 25976 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 avril 2024 3 287
16 févr. 2010 à 13:46
essaie de faire requête après requête...
0
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 311
16 févr. 2010 à 13:50
Visiblement le explain plante car il veut ecrire dans une table qui n'est pas assez grande ^^

Mais sinon la partie qui prend du temps je l'ai trouvé c'est ca:

SELECT *
FROM rgxtmvc mvc
WHERE mvc.cdmagdis = 4264
AND mvc.dtjurcpt = TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy')
AND mvc.cdtypmvt IN (100,102,110,111)) mvc
--,rgxtetn etn
WHERE STRUCTURE.nmc_fam_cdnmccmr = mvc.cdnmccmr(+)
AND NOT EXISTS (
SELECT *
FROM rgxtetn etn
WHERE ( ( etn.dtfinlieeat IS NOT NULL
AND TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy')
BETWEEN etn.dtdebeatnmc
AND etn.dtfinlieeat
)
OR ( etn.dtfinlieeat IS NULL
AND TO_TIMESTAMP ('08/01/2010', 'dd/MM/yyyy') >=
etn.dtdebeatnmc
)
)
AND etn.cdeatobjrgx IN (10,12)
AND ( etn.cdnmccmr = STRUCTURE.nmc_dpt_cdnmccmr
OR etn.cdnmccmr = STRUCTURE.nmc_gp_cdnmccmr
OR etn.cdnmccmr = STRUCTURE.nmc_ue_cdnmccmr
))


Qui permet de récupérer les champs nécessaire pour faire se calcul:

SUM (DECODE (orvalmnt, 'C', vlmntmvt, -vlmntmvt)) AS montant


Alors je vais essayer d'extraire cette partie de la requete et de la traiter séparement...

J'adore les grandes requêtes SQL comme ca xD
0
PRO_PHP Messages postés 95 Date d'inscription jeudi 11 février 2010 Statut Membre Dernière intervention 27 avril 2010 1
16 févr. 2010 à 14:15
au lieu de faire plein de select tu devrai faire des INNER JOIN c'est plus rapide :)
0
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 311
17 févr. 2010 à 10:09
Je peux pas faire des inner join...
enfin pas plus que ce qu'il y'a deja!

Le probleme viens du fait que les données sont trop nombreuses et trop enfouilli ^^
0
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 311
18 févr. 2010 à 09:12
La creation d'un index bien choisit (ce qui n'était pas le cas avant^^) règle le problème^^

Merci à vous!
0