Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

optimiser une requete !!

2 réponses
Avatar
Troyan
Bonjour a tous j'ai cette requete qui presente un isnull()
celui me prend du temps un peu trop d'ailleurs mais je ne
vois pas comment le remplacer pouvez vous m'indiquez une
optimisation.



SELECT R.CREATION_DATE, R.CLE_REGLEMENTS,
R.CLE_SOCIETES_PARTICULIERS,
R.CLE_SOCIETES_PARTICULIERS_RF, R.MILLESIME,
R.ANNEE_FISCALE, R.DATE_RECEPTION_REGLEMENT,
R.MONTANT_EURO, R.BLOCAGE_RF, R.BLOCAGE_E_RF,
R.TYPE_REGLEMENT, R.ORIGINE_DON, R.BENEFICE_ou_DON,
R.CLE_REGLEMENTS_VENTILES, isnull(REF_ORIGINE_DON.RF,0) as
RF , SP.WAITING_ROOM , R.VERIF_BANQUE FROM REGLEMENTS R
WITH (nolock) left outer JOIN REF_ORIGINE_DON WITH
(nolock) ON R.ORIGINE_DON = REF_ORIGINE_DON.ORIGINE_DON
INNER JOIN SOCIETES_PARTICULIERS SP WITH (nolock) ON isnull
(R.CLE_SOCIETES_PARTICULIERS_RF,
R.CLE_SOCIETES_PARTICULIERS)=SP.CLE_SOCIETES_PARTICULIERS
WHERE SP.CLE_SOCIETES_PARTICULIERS = '20021205003493' AND
(isnull(R.CLE_REGLEMENTS_VENTILES,0)<>R.CLE_REGLEMENTS )
AND (R.MONTANT_EURO>0) ORDER BY R.ANNEE_FISCALE DESC,
R.CREATION_DATE DESC

2 réponses

Avatar
Fred BROUARD
D'abord tu pourrait indenter ta requête pour la rendre lisible, ce
serait une marque de politesse

il n'y a pas grand chose à optimiser surtout si tu ne donne pas le
contexte d'éxécution, un jeu d'essai et le résultat attendu.

Par contre l'usage du NOLOCK peut conduire à de la lecture sale...
ce qui apporterait des données anormales .

Enfin, as tu impérativement besoin du tri ?
C'est là que le temps perdu est souvent le plus important !

A lire sur l'optimisation :
http://sqlpro.developpez.com/OptimSQL/SQL_optim.html


Reformatée ta requête donne :

Ne trouve tu pas cela plus lisible ???

SELECT R.CREATION_DATE,
R.CLE_REGLEMENTS,
R.CLE_SOCIETES_PARTICULIERS,
R.CLE_SOCIETES_PARTICULIERS_RF,
R.MILLESIME,
R.ANNEE_FISCALE,
R.DATE_RECEPTION_REGLEMENT,
R.MONTANT_EURO,
R.BLOCAGE_RF,
R.BLOCAGE_E_RF,
R.TYPE_REGLEMENT,
R.ORIGINE_DON,
R.BENEFICE_ou_DON,
R.CLE_REGLEMENTS_VENTILES,
COALESCE(REF_ORIGINE_DON.RF, 0) as RF,
SP.WAITING_ROOM,
R.VERIF_BANQUE

FROM REGLEMENTS R WITH (nolock)

LEFT OUTER JOIN REF_ORIGINE_DON ROD WITH (nolock)
ON R.ORIGINE_DON = ROD.ORIGINE_DON

INNER JOIN SOCIETES_PARTICULIERS SP WITH (nolock)
ON COALESCE (R.CLE_SOCIETES_PARTICULIERS_RF,
R.CLE_SOCIETES_PARTICULIERS) SP.CLE_SOCIETES_PARTICULIERS

WHERE SP.CLE_SOCIETES_PARTICULIERS = '20021205003493'
AND COALESCE(R.CLE_REGLEMENTS_VENTILES,0) <> R.CLE_REGLEMENTS
AND R.MONTANT_EURO > 0

ORDER BY R.ANNEE_FISCALE DESC, R.CREATION_DATE DESC

A +

--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************

Troyan a écrit:
Bonjour a tous j'ai cette requete qui presente un isnull()
celui me prend du temps un peu trop d'ailleurs mais je ne
vois pas comment le remplacer pouvez vous m'indiquez une
optimisation.



SELECT R.CREATION_DATE, R.CLE_REGLEMENTS,
R.CLE_SOCIETES_PARTICULIERS,
R.CLE_SOCIETES_PARTICULIERS_RF, R.MILLESIME,
R.ANNEE_FISCALE, R.DATE_RECEPTION_REGLEMENT,
R.MONTANT_EURO, R.BLOCAGE_RF, R.BLOCAGE_E_RF,
R.TYPE_REGLEMENT, R.ORIGINE_DON, R.BENEFICE_ou_DON,
R.CLE_REGLEMENTS_VENTILES, isnull(REF_ORIGINE_DON.RF,0) as
RF , SP.WAITING_ROOM , R.VERIF_BANQUE FROM REGLEMENTS R
WITH (nolock) left outer JOIN REF_ORIGINE_DON WITH
(nolock) ON R.ORIGINE_DON = REF_ORIGINE_DON.ORIGINE_DON
INNER JOIN SOCIETES_PARTICULIERS SP WITH (nolock) ON isnull
(R.CLE_SOCIETES_PARTICULIERS_RF,
R.CLE_SOCIETES_PARTICULIERS)=SP.CLE_SOCIETES_PARTICULIERS
WHERE SP.CLE_SOCIETES_PARTICULIERS = '20021205003493' AND
(isnull(R.CLE_REGLEMENTS_VENTILES,0)<>R.CLE_REGLEMENTS )
AND (R.MONTANT_EURO>0) ORDER BY R.ANNEE_FISCALE DESC,
R.CREATION_DATE DESC


Avatar
troyan
Excuse pour la mise en page,
mais c'ete ce matin a 6h j'ai passé la nuit au taf...sorry.


pour le nolock tu as raison mais bon j'ai pas tous les
pouvoirs, de decisions.

ma question est simplment basé sur la vitesse si j'enleve
le isnull() c'est presque du instantané, donc comme je ne
peux m'en passer.
je voulais juste savoir si il y'avais un moyen de le
contourner avec une autre methode ??

voila donc je suis toujours preneurs, le tri n'influence
pas cartres peu d'enregistrement sont en retour,

genre 5 ou 6 par contre sur des table de 6 millions...


@+ et merci



-----Message d'origine-----
D'abord tu pourrait indenter ta requête pour la rendre


lisible, ce
serait une marque de politesse

il n'y a pas grand chose à optimiser surtout si tu ne


donne pas le
contexte d'éxécution, un jeu d'essai et le résultat


attendu.

Par contre l'usage du NOLOCK peut conduire à de la


lecture sale...
ce qui apporterait des données anormales .

Enfin, as tu impérativement besoin du tri ?
C'est là que le temps perdu est souvent le plus


important !

A lire sur l'optimisation :
http://sqlpro.developpez.com/OptimSQL/SQL_optim.html


Reformatée ta requête donne :

Ne trouve tu pas cela plus lisible ???

SELECT R.CREATION_DATE,
R.CLE_REGLEMENTS,
R.CLE_SOCIETES_PARTICULIERS,
R.CLE_SOCIETES_PARTICULIERS_RF,
R.MILLESIME,
R.ANNEE_FISCALE,
R.DATE_RECEPTION_REGLEMENT,
R.MONTANT_EURO,
R.BLOCAGE_RF,
R.BLOCAGE_E_RF,
R.TYPE_REGLEMENT,
R.ORIGINE_DON,
R.BENEFICE_ou_DON,
R.CLE_REGLEMENTS_VENTILES,
COALESCE(REF_ORIGINE_DON.RF, 0) as RF,
SP.WAITING_ROOM,
R.VERIF_BANQUE

FROM REGLEMENTS R WITH (nolock)

LEFT OUTER JOIN REF_ORIGINE_DON ROD WITH (nolock)
ON R.ORIGINE_DON = ROD.ORIGINE_DON

INNER JOIN SOCIETES_PARTICULIERS SP WITH (nolock)
ON COALESCE (R.CLE_SOCIETES_PARTICULIERS_RF,
R.CLE_SOCIETES_PARTICULIERS) =
SP.CLE_SOCIETES_PARTICULIERS

WHERE SP.CLE_SOCIETES_PARTICULIERS = '20021205003493'
AND COALESCE(R.CLE_REGLEMENTS_VENTILES,0) <>


R.CLE_REGLEMENTS
AND R.MONTANT_EURO > 0

ORDER BY R.ANNEE_FISCALE DESC, R.CREATION_DATE DESC

A +

--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server /


Delphi / web
Livre SQL - col. Référence :


http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros :


http://sqlpro.developpez.com
****************** mailto:


******************

Troyan a écrit:
Bonjour a tous j'ai cette requete qui presente un isnull




()
celui me prend du temps un peu trop d'ailleurs mais je




ne
vois pas comment le remplacer pouvez vous m'indiquez




une
optimisation.



SELECT R.CREATION_DATE, R.CLE_REGLEMENTS,
R.CLE_SOCIETES_PARTICULIERS,
R.CLE_SOCIETES_PARTICULIERS_RF, R.MILLESIME,
R.ANNEE_FISCALE, R.DATE_RECEPTION_REGLEMENT,
R.MONTANT_EURO, R.BLOCAGE_RF, R.BLOCAGE_E_RF,
R.TYPE_REGLEMENT, R.ORIGINE_DON, R.BENEFICE_ou_DON,
R.CLE_REGLEMENTS_VENTILES, isnull(REF_ORIGINE_DON.RF,0)




as
RF , SP.WAITING_ROOM , R.VERIF_BANQUE FROM REGLEMENTS R
WITH (nolock) left outer JOIN REF_ORIGINE_DON WITH
(nolock) ON R.ORIGINE_DON = REF_ORIGINE_DON.ORIGINE_DON
INNER JOIN SOCIETES_PARTICULIERS SP WITH (nolock) ON




isnull
(R.CLE_SOCIETES_PARTICULIERS_RF,
R.CLE_SOCIETES_PARTICULIERS)




=SP.CLE_SOCIETES_PARTICULIERS
WHERE SP.CLE_SOCIETES_PARTICULIERS = '20021205003493'




AND
(isnull(R.CLE_REGLEMENTS_VENTILES,0)




<>R.CLE_REGLEMENTS )
AND (R.MONTANT_EURO>0) ORDER BY R.ANNEE_FISCALE DESC,
R.CREATION_DATE DESC



.