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 -
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!
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!
A voir également:
- Requete trop longue!
- Application pour capter wifi longue distance - Télécharger - Connexion à distance
- Requête bloquée par le pare-feu applicatif claranet webfence ✓ - Forum Réseaux sociaux
- Requete sql pix - Forum PHP
- Excel barre de défilement trop longue - Forum Excel
- Le seigneur des anneaux version longue torrent ✓ - Forum Téléchargement
10 réponses
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...
C'est plus rapide et ta moin de chance que ca plante...
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;
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;
Salut,
c'est sur quel SGBD ?
Je vois beaucoup de select * dans les sous-requêtes, as-tu besoin de tous les champs ?
c'est sur quel SGBD ?
Je vois beaucoup de select * dans les sous-requêtes, as-tu besoin de tous les champs ?
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!
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!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'arrive pas à faire un explain avec SQL Developer, je fais ca:
EXPLAIN PLAN FOR
Ma requete
Et ca me sors une erreur...
EXPLAIN PLAN FOR
Ma requete
Et ca me sors une erreur...
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
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