OVH Cloud OVH Cloud

Délai de requete dépassé selon un critère

2 réponses
Avatar
Alexandre LECOQ
Bonjour,

J'ai une requete qui fonctionne tr=E8s bien lorsque je la=20
lance sans crit=E8re ou selon certain crit=E8re mais qui=20
plante lorsque je rentre d'autre crit=E8res. Je m'explique

J'ai une requete qui m'affiche toutes les machines de=20
plusieurs pays qui sont HS. Cette requete fonctionne=20
correctement toute seule.
Lorsque je rentre un crit=E8re correspondant =E0 un pays (ex :=20
1 pour la France), elle fonctionne aussi. Par contre, si=20
je rentre le crit=E8re 2 ou 3 (correspondant =E0 l'Espagne et=20
=E0 l'Angleterre), j'ai le message d=E9lai d'attente d=E9pass=E9.

Pourquoi elle fonctionne selon le crit=E8re ??
Voici ma requete :

SELECT TOP 100 PERCENT dbo.BORNES.BORNE,=20
dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE,
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,=20
dbo.BORNES.COMMENTAIRE, dbo.PAYS.ID_PAYS,=20
dbo.REGIONS.ID_DR,
MAX(dbo.MATCHREQUEST.DateMatchRequest) AS [Date],
MAX(dbo.MATCHREQUEST.HeureMatchRequest) AS Heure,=20
dbo.PLAQUES.ID_PLAQUE
FROM dbo.REGIONS INNER JOIN
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =3D=20
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS =3D dbo.PAYS.ID_PAYS=20
ON dbo.REGIONS.ID_DR =3D dbo.AFFAIRES.ID_DR INNER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =3D=20
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =3D=20
dbo.PLAQUES.ID_PLAQUE LEFT OUTER JOIN
dbo.[MODULE2-BORNES OK] ON dbo.BORNES.BORNE =3D dbo.
[MODULE2-BORNES OK].BORNE
WHERE (dbo.[MODULE2-BORNES OK].BORNE IS NULL)
GROUP BY dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE,=20
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,=20
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,=20
dbo.BORNES.COMMENTAIRE, dbo.PLAQUES.ID_PLAQUE

C'est un peu fouilli, mais cette vue appelle une autre=20
vue :

SELECT TOP 100 PERCENT
dbo.MATCHREQUEST.NomMachine AS BORNE,=20
dbo.MATCHREQUEST.DateMatchRequest,=20
dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE,=20
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,=20
dbo.AFFAIRES.CP,=20
dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION, =20
dbo.PLAQUES.ID_PLAQUE
FROM
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =3D=20
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS =3D dbo.PAYS.ID_PAYS=20
INNER JOIN
dbo.REGIONS ON dbo.AFFAIRES.ID_DR =3D dbo.REGIONS.ID_DR=20
RIGHT OUTER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =3D=20
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =3D=20
dbo.PLAQUES.ID_PLAQUE
GROUP BY dbo.MATCHREQUEST.DateMatchRequest,=20
dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE,=20
dbo.AFFAIRES.VILLE,=20
dbo.REGIONS.REGION, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,=20
dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE,=20
dbo.REGIONS.REGION,=20
dbo.PLAQUES.ID_PLAQUE, dbo.MATCHREQUEST.NomMachine
HAVING (dbo.MATCHREQUEST.DateMatchRequest =3D CONVERT
(char(10), GETDATE(), 103))

Si vous me comprenez et que vous pouvez m'aider, je vous=20
en serais reconnaissant

2 réponses

Avatar
Fred BROUARD
Quel est l'intérêt du TOP 100 PRECENT ?

Pourquoi utiliser un HAVING et un GROUP BY sans agrégat ???

si ce n'est que de bouffer du processeur et donc du temps !

de plus l'utilisant de nom d'objet anormatif comme "MODULE2-BORNES OK" avec
espace et tiret consomme aussi du temps

Pour ta première requête une correction peut être :

SELECT B.BORNE,
A.AFFAIRE,
A.VILLE,
A.CP,
R.REGION,
B.COMMENTAIRE,
P.ID_PAYS,
R.ID_DR,
MAX(M.DateMatchRequest) AS [Date],
MAX(M.HeureMatchRequest) AS Heure,
Q.ID_PLAQUE

FROM REGIONS R
INNER JOIN AFFAIRES A
ON R.ID_DR = A.ID_DR
INNER JOIN BORNES B
ON A.ID_AFFAIRE = B.ID_AFFAIRE
INNER JOIN MATCHREQUEST M
ON B.BORNE = M.NomMachine
LEFT OUTER JOIN [MODULE2-BORNES OK] OK
ON B.BORNE = OK.BORNE
INNER JOIN PAYS P
ON A.ID_PAYS = P.ID_PAYS
LEFT OUTER JOIN PLAQUES Q
A.ID_PLAQUE = Q.ID_PLAQUE

WHERE OK.BORNE IS NULL

GROUP B.BORNE,
A.AFFAIRE,
A.VILLE,
A.CP,
R.REGION,
B.COMMENTAIRE,
P.ID_PAYS,
R.ID_DR,
Q.ID_PLAQUE

Pour la seconde, supprime le TOP 100 PERCENT, et replace le HAVING par un Filtre
WHERE
Essaye aussi de mettre un LEFT OUTER JOIN plutôt que d'utiliser le right

Enfin, s'agissant de vues (?) tu peut les indexer pour aller plus vite

A +


Alexandre LECOQ a écrit:
Bonjour,

J'ai une requete qui fonctionne très bien lorsque je la
lance sans critère ou selon certain critère mais qui
plante lorsque je rentre d'autre critères. Je m'explique

J'ai une requete qui m'affiche toutes les machines de
plusieurs pays qui sont HS. Cette requete fonctionne
correctement toute seule.
Lorsque je rentre un critère correspondant à un pays (ex :
1 pour la France), elle fonctionne aussi. Par contre, si
je rentre le critère 2 ou 3 (correspondant à l'Espagne et
à l'Angleterre), j'ai le message délai d'attente dépassé.

Pourquoi elle fonctionne selon le critère ??
Voici ma requete :

SELECT TOP 100 PERCENT dbo.BORNES.BORNE,
dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE,
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,
dbo.BORNES.COMMENTAIRE, dbo.PAYS.ID_PAYS,
dbo.REGIONS.ID_DR,
MAX(dbo.MATCHREQUEST.DateMatchRequest) AS [Date],
MAX(dbo.MATCHREQUEST.HeureMatchRequest) AS Heure,
dbo.PLAQUES.ID_PLAQUE
FROM dbo.REGIONS INNER JOIN
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS
ON dbo.REGIONS.ID_DR = dbo.AFFAIRES.ID_DR INNER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =
dbo.PLAQUES.ID_PLAQUE LEFT OUTER JOIN
dbo.[MODULE2-BORNES OK] ON dbo.BORNES.BORNE = dbo.
[MODULE2-BORNES OK].BORNE
WHERE (dbo.[MODULE2-BORNES OK].BORNE IS NULL)
GROUP BY dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,
dbo.BORNES.COMMENTAIRE, dbo.PLAQUES.ID_PLAQUE

C'est un peu fouilli, mais cette vue appelle une autre
vue :

SELECT TOP 100 PERCENT
dbo.MATCHREQUEST.NomMachine AS BORNE,
dbo.MATCHREQUEST.DateMatchRequest,
dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP,
dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION,
dbo.PLAQUES.ID_PLAQUE
FROM
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS
INNER JOIN
dbo.REGIONS ON dbo.AFFAIRES.ID_DR = dbo.REGIONS.ID_DR
RIGHT OUTER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =
dbo.PLAQUES.ID_PLAQUE
GROUP BY dbo.MATCHREQUEST.DateMatchRequest,
dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE,
dbo.REGIONS.REGION, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE,
dbo.REGIONS.REGION,
dbo.PLAQUES.ID_PLAQUE, dbo.MATCHREQUEST.NomMachine
HAVING (dbo.MATCHREQUEST.DateMatchRequest = CONVERT
(char(10), GETDATE(), 103))

Si vous me comprenez et que vous pouvez m'aider, je vous
en serais reconnaissant



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste 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
************************ www.datasapiens.com *************************
Avatar
Alexandre LECOQ
Bonjour Fred et merci pour ton aide, la modification que
tu as faites sur ma requete me permet de nouveau d'obtenir
les résultats (encore une peu longue pour l'espagne, mais
je vais analyser ça).
Par contre, tu me demandes d'utiliser un LEFT OUTER JOIN
plutot qu'un RIGHT, quelle est la différence entre les
deux.

Encore merci et à bientôt.

Alexandre LECOQ
-----Message d'origine-----
Quel est l'intérêt du TOP 100 PRECENT ?

Pourquoi utiliser un HAVING et un GROUP BY sans


agrégat ???

si ce n'est que de bouffer du processeur et donc du


temps !

de plus l'utilisant de nom d'objet anormatif


comme "MODULE2-BORNES OK" avec
espace et tiret consomme aussi du temps

Pour ta première requête une correction peut être :

SELECT B.BORNE,
A.AFFAIRE,
A.VILLE,
A.CP,
R.REGION,
B.COMMENTAIRE,
P.ID_PAYS,
R.ID_DR,
MAX(M.DateMatchRequest) AS [Date],
MAX(M.HeureMatchRequest) AS Heure,
Q.ID_PLAQUE

FROM REGIONS R
INNER JOIN AFFAIRES A
ON R.ID_DR = A.ID_DR
INNER JOIN BORNES B
ON A.ID_AFFAIRE = B.ID_AFFAIRE
INNER JOIN MATCHREQUEST M
ON B.BORNE = M.NomMachine
LEFT OUTER JOIN [MODULE2-BORNES OK] OK
ON B.BORNE = OK.BORNE
INNER JOIN PAYS P
ON A.ID_PAYS = P.ID_PAYS
LEFT OUTER JOIN PLAQUES Q
A.ID_PLAQUE = Q.ID_PLAQUE

WHERE OK.BORNE IS NULL

GROUP B.BORNE,
A.AFFAIRE,
A.VILLE,
A.CP,
R.REGION,
B.COMMENTAIRE,
P.ID_PAYS,
R.ID_DR,
Q.ID_PLAQUE

Pour la seconde, supprime le TOP 100 PERCENT, et replace


le HAVING par un Filtre
WHERE
Essaye aussi de mettre un LEFT OUTER JOIN plutôt que


d'utiliser le right

Enfin, s'agissant de vues (?) tu peut les indexer pour


aller plus vite

A +


Alexandre LECOQ a écrit:
Bonjour,

J'ai une requete qui fonctionne très bien lorsque je la
lance sans critère ou selon certain critère mais qui
plante lorsque je rentre d'autre critères. Je m'explique

J'ai une requete qui m'affiche toutes les machines de
plusieurs pays qui sont HS. Cette requete fonctionne
correctement toute seule.
Lorsque je rentre un critère correspondant à un pays




(ex :
1 pour la France), elle fonctionne aussi. Par contre,




si
je rentre le critère 2 ou 3 (correspondant à l'Espagne




et
à l'Angleterre), j'ai le message délai d'attente




dépassé.

Pourquoi elle fonctionne selon le critère ??
Voici ma requete :

SELECT TOP 100 PERCENT dbo.BORNES.BORNE,
dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE,
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,
dbo.BORNES.COMMENTAIRE, dbo.PAYS.ID_PAYS,
dbo.REGIONS.ID_DR,
MAX(dbo.MATCHREQUEST.DateMatchRequest) AS [Date],
MAX(dbo.MATCHREQUEST.HeureMatchRequest) AS Heure,
dbo.PLAQUES.ID_PLAQUE
FROM dbo.REGIONS INNER JOIN
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS =




dbo.PAYS.ID_PAYS
ON dbo.REGIONS.ID_DR = dbo.AFFAIRES.ID_DR INNER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =
dbo.PLAQUES.ID_PLAQUE LEFT OUTER JOIN
dbo.[MODULE2-BORNES OK] ON dbo.BORNES.BORNE = dbo.
[MODULE2-BORNES OK].BORNE
WHERE (dbo.[MODULE2-BORNES OK].BORNE IS NULL)
GROUP BY dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS,




dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,
dbo.BORNES.COMMENTAIRE, dbo.PLAQUES.ID_PLAQUE

C'est un peu fouilli, mais cette vue appelle une autre
vue :

SELECT TOP 100 PERCENT
dbo.MATCHREQUEST.NomMachine AS BORNE,
dbo.MATCHREQUEST.DateMatchRequest,
dbo.MATCHREQUEST.HeureMatchRequest,




dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS,




dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP,
dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION,
dbo.PLAQUES.ID_PLAQUE
FROM
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS
INNER JOIN
dbo.REGIONS ON dbo.AFFAIRES.ID_DR =




dbo.REGIONS.ID_DR
RIGHT OUTER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =
dbo.PLAQUES.ID_PLAQUE
GROUP BY dbo.MATCHREQUEST.DateMatchRequest,
dbo.MATCHREQUEST.HeureMatchRequest,




dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE,
dbo.REGIONS.REGION, dbo.PAYS.ID_PAYS,




dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE,
dbo.REGIONS.REGION,
dbo.PLAQUES.ID_PLAQUE, dbo.MATCHREQUEST.NomMachine
HAVING (dbo.MATCHREQUEST.DateMatchRequest = CONVERT
(char(10), GETDATE(), 103))

Si vous me comprenez et que vous pouvez m'aider, je




vous
en serais reconnaissant



--
Frédéric BROUARD, MVP SQL Server. Expert SQL /


spécialiste 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
************************ www.datasapiens.com


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

.