Requete trop longue!

Résolu
xav3601 Messages postés 3289 Date d'inscription   Statut Membre Dernière intervention   -  
xav3601 Messages postés 3289 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   1
 
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 3289 Date d'inscription   Statut Membre Dernière intervention   311
 
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 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
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 3289 Date d'inscription   Statut Membre Dernière intervention   311
 
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 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Que dit un EXPLAIN ?
0
xav3601 Messages postés 3289 Date d'inscription   Statut Membre Dernière intervention   311
 
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 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
essaie de faire requête après requête...
0
xav3601 Messages postés 3289 Date d'inscription   Statut Membre Dernière intervention   311
 
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   Statut Membre Dernière intervention   1
 
au lieu de faire plein de select tu devrai faire des INNER JOIN c'est plus rapide :)
0
xav3601 Messages postés 3289 Date d'inscription   Statut Membre Dernière intervention   311
 
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 3289 Date d'inscription   Statut Membre Dernière intervention   311
 
La creation d'un index bien choisit (ce qui n'était pas le cas avant^^) règle le problème^^

Merci à vous!
0