OVH Cloud OVH Cloud

Exec sp_execute

2 réponses
Avatar
Psa555
Bonjour,

J'ai ces deux requêtes ci-bas : Qui en principe est la même requête mais
exécuté de façon différente.
La première : temps réponse très rapide 10 ms aucun problème. Plan
d'éxécution est correct utilise le bon INDEX.
La deuxième : Temps répons très lent 1 minutes 7 sec, Plan d'exécution
différent et n'utilise pas le bon INDEX
Comment ca ???
Requête 1:
SELECT ID_CLIEN_IDC FROM dbo.IDCT0107_CLIEN_POINT_ENTR CPE with (nolock)
WHERE CPE.CLE_SYSTM='OSC_0012235312'
AND CPE.ID_SYSTM=8
AND CPE.CO_TYPE_POINT_ENTR='ADHRN'
AND CPE.TYPE_RELTN='ADM'
Requête 2:
exec sp_executesql
N'SELECT ID_CLIEN_IDC
FROM dbo.IDCT0107_CLIEN_POINT_ENTR CPE with(nolock)
WHERE CPE.CLE_SYSTM=@CLE_SYSTM
AND CPE.ID_SYSTM=@ID_SYSTM
AND CPE.CO_TYPE_POINT_ENTR=@CO_TYPE_POINT_ENTR
AND CPE.TYPE_RELTN=@TYPE_RELTN',
N'@CLE_SYSTM nvarchar(14),
@ID_SYSTM int,
@CO_TYPE_POINT_ENTR nvarchar(5),
@TYPE_RELTN nvarchar(3)',
@CLE_SYSTM = N'OSC_0012235312',
@ID_SYSTM = 8,
@CO_TYPE_POINT_ENTR = N'ADHRN',
@TYPE_RELTN = N'ADM'

2 réponses

Avatar
Fred.M.
bonjour,
Il arrive en effet que le plan d'exécution SQL se gauffre sur du SQL
dynamique ou au sein de traitement de curseurs. Dans la mesure où tu as
identifié un plan d'exécution correct et le bon index à exploiter, tu peux
forcer l'utilisation de cet index en indiquant un index hint:

... from MaTable with (index(MonIndex))
...

Ainsi le plan d'exécution devra forcément passer par l'index que tu aura
poser dans ta requête.
Bon courage.

Fred. M.
"Psa555" a écrit :

Bonjour,

J'ai ces deux requêtes ci-bas : Qui en principe est la même requête mais
exécuté de façon différente.
La première : temps réponse très rapide 10 ms aucun problème. Plan
d'éxécution est correct utilise le bon INDEX.
La deuxième : Temps répons très lent 1 minutes 7 sec, Plan d'exécution
différent et n'utilise pas le bon INDEX
Comment ca ???
Requête 1:
SELECT ID_CLIEN_IDC FROM dbo.IDCT0107_CLIEN_POINT_ENTR CPE with (nolock)
WHERE CPE.CLE_SYSTM='OSC_0012235312'
AND CPE.ID_SYSTM=8
AND CPE.CO_TYPE_POINT_ENTR='ADHRN'
AND CPE.TYPE_RELTN='ADM'
Requête 2:
exec sp_executesql
N'SELECT ID_CLIEN_IDC
FROM dbo.IDCT0107_CLIEN_POINT_ENTR CPE with(nolock)
WHERE CPE.CLE_SYSTM=@CLE_SYSTM
AND CPE.ID_SYSTM=@ID_SYSTM
AND CPE.CO_TYPE_POINT_ENTR=@CO_TYPE_POINT_ENTR
AND CPE.TYPE_RELTN=@TYPE_RELTN',
N'@CLE_SYSTM nvarchar(14),
@ID_SYSTM int,
@CO_TYPE_POINT_ENTR nvarchar(5),
@TYPE_RELTN nvarchar(3)',
@CLE_SYSTM = N'OSC_0012235312',
@ID_SYSTM = 8,
@CO_TYPE_POINT_ENTR = N'ADHRN',
@TYPE_RELTN = N'ADM'



Avatar
Psa555
Merci j'ai trouvé la problèmatique ....

Les paramêtres étaient typés nvarchar ... au lieu de varchar ... ce qui fait
une grosse
différence car un conversion ce fait et le choix du plan d'éxécution est
faussé.

Merci


"Fred.M." a écrit :

bonjour,
Il arrive en effet que le plan d'exécution SQL se gauffre sur du SQL
dynamique ou au sein de traitement de curseurs. Dans la mesure où tu as
identifié un plan d'exécution correct et le bon index à exploiter, tu peux
forcer l'utilisation de cet index en indiquant un index hint:

... from MaTable with (index(MonIndex))
...

Ainsi le plan d'exécution devra forcément passer par l'index que tu aura
poser dans ta requête.
Bon courage.

Fred. M.
"Psa555" a écrit :

> Bonjour,
>
> J'ai ces deux requêtes ci-bas : Qui en principe est la même requête mais
> exécuté de façon différente.
> La première : temps réponse très rapide 10 ms aucun problème. Plan
> d'éxécution est correct utilise le bon INDEX.
> La deuxième : Temps répons très lent 1 minutes 7 sec, Plan d'exécution
> différent et n'utilise pas le bon INDEX
> Comment ca ???
> Requête 1:
> SELECT ID_CLIEN_IDC FROM dbo.IDCT0107_CLIEN_POINT_ENTR CPE with (nolock)
> WHERE CPE.CLE_SYSTM='OSC_0012235312'
> AND CPE.ID_SYSTM=8
> AND CPE.CO_TYPE_POINT_ENTR='ADHRN'
> AND CPE.TYPE_RELTN='ADM'
> Requête 2:
> exec sp_executesql
> N'SELECT ID_CLIEN_IDC
> FROM dbo.IDCT0107_CLIEN_POINT_ENTR CPE with(nolock)
> WHERE CPE.CLE_SYSTM=@CLE_SYSTM
> AND CPE.ID_SYSTM=@ID_SYSTM
> AND CPE.CO_TYPE_POINT_ENTR=@CO_TYPE_POINT_ENTR
> AND CPE.TYPE_RELTN=@TYPE_RELTN',
> N'@CLE_SYSTM nvarchar(14),
> @ID_SYSTM int,
> @CO_TYPE_POINT_ENTR nvarchar(5),
> @TYPE_RELTN nvarchar(3)',
> @CLE_SYSTM = N'OSC_0012235312',
> @ID_SYSTM = 8,
> @CO_TYPE_POINT_ENTR = N'ADHRN',
> @TYPE_RELTN = N'ADM'
>