OVH Cloud OVH Cloud

Impossible d'obtenir le plan de requête d'une procédure stockée

5 réponses
Avatar
Jean-Yves
Bonjour,

Il m'est impossible d'obtenir le plan de requête d'une procédure stockée par
le biais de l'analyseur de requête, je pense parce qu'elle contient des
tables temporaires. Est-ce normal ? Y a-t-il une solution ?
Merci.

5 réponses

Avatar
TLE91
Bonjour,
J'ai fait le test suivan
-------------------------------------------------------------------------------------------------
create proc _test
as
begin
select top 10 * into #t from t order by pk
select * from #t
end
go
exec _tes
-------------------------------------------------------------------------------------------------
Si je demande le plab d'exécution sr "exec _test", je n'ai pas de problème
et je vois un plan pour chaqe instruction.
Si possible, pourriez-vous poster le code de votre proc pour affiner la
recherche.

Cordialement.

"Jean-Yves" a écrit :

Bonjour,

Il m'est impossible d'obtenir le plan de requête d'une procédure stockée par
le biais de l'analyseur de requête, je pense parce qu'elle contient des
tables temporaires. Est-ce normal ? Y a-t-il une solution ?
Merci.


Avatar
Jean-Yves
Bonjour,

J'ai fait le test suivant
------------------------------------------------
CREATE PROCEDURE dbo.test AS
begin
create table #t(
myid INT,
mychar CHAR(4))

insert into #t values(1, 'AAAA')
insert into #t values(2, 'BBBB')
insert into #t values(3, 'CCCC')
insert into #t values(4, 'DDDD')
insert into #t values(5, 'EEEE')

select * from #t
end
GO
------------------------------------------------
et j'ai l'erreur suivante :
Serveur : Msg 208, Niveau 16, État 1, Procédure test, Ligne 7
'#t' : nom d'objet incorrect.

Je suppose que c'est l'utilisation du create table/insert qui pose problème,
par opposition au select into. Pour info, j'ai fait le test avec
insert...select au lieu de insert...values et ça donne le même résultat.

Merci de la réponse.
------------------------------------------------
"TLE91" a écrit :

Bonjour,
J'ai fait le test suivant
-------------------------------------------------------------------------------------------------
create proc _test
as
begin
select top 10 * into #t from t order by pk
select * from #t
end
go
exec _test
-------------------------------------------------------------------------------------------------
Si je demande le plab d'exécution sr "exec _test", je n'ai pas de problème
et je vois un plan pour chaqe instruction.
Si possible, pourriez-vous poster le code de votre proc pour affiner la
recherche.

Cordialement.

"Jean-Yves" a écrit :

> Bonjour,
>
> Il m'est impossible d'obtenir le plan de requête d'une procédure stockée par
> le biais de l'analyseur de requête, je pense parce qu'elle contient des
> tables temporaires. Est-ce normal ? Y a-t-il une solution ?
> Merci.


Avatar
TLE91
Bonjour,
Je ne comprend pas car j'ai fait un copier/coller de votre code en exemple
et pas de problème pour moi !!
Quelle version de SQl Server utilisez-vous (Enterprise, Developpeur,
Standard ou MSDN) ? Pour être sûr vous pouvez faire SELECT @@VERSION sous
l'analyseur de requête et ensuite comparer le résultat avec la liste suivante
:
8.00.194 ==> Server 2000 RTM
8.00.384 ==> Server 2000 SP1
8.00.534 ==> Server 2000 SP2
8.00.760 ==> Server 2000 SP3
8.00.2039 ==> Server 2000 SP4

Autre point avec quel user utilisez-vous pour exécuter ce code ? Quels sont
ses droits ?

Cordialement.




"Jean-Yves" a écrit :

Bonjour,

J'ai fait le test suivant
------------------------------------------------
CREATE PROCEDURE dbo.test AS
begin
create table #t(
myid INT,
mychar CHAR(4))

insert into #t values(1, 'AAAA')
insert into #t values(2, 'BBBB')
insert into #t values(3, 'CCCC')
insert into #t values(4, 'DDDD')
insert into #t values(5, 'EEEE')

select * from #t
end
GO
------------------------------------------------
et j'ai l'erreur suivante :
Serveur : Msg 208, Niveau 16, État 1, Procédure test, Ligne 7
'#t' : nom d'objet incorrect.

Je suppose que c'est l'utilisation du create table/insert qui pose problème,
par opposition au select into. Pour info, j'ai fait le test avec
insert...select au lieu de insert...values et ça donne le même résultat.

Merci de la réponse.
------------------------------------------------
"TLE91" a écrit :

> Bonjour,
> J'ai fait le test suivant
> -------------------------------------------------------------------------------------------------
> create proc _test
> as
> begin
> select top 10 * into #t from t order by pk
> select * from #t
> end
> go
> exec _test
> -------------------------------------------------------------------------------------------------
> Si je demande le plab d'exécution sr "exec _test", je n'ai pas de problème
> et je vois un plan pour chaqe instruction.
> Si possible, pourriez-vous poster le code de votre proc pour affiner la
> recherche.
>
> Cordialement.
>
> "Jean-Yves" a écrit :
>
> > Bonjour,
> >
> > Il m'est impossible d'obtenir le plan de requête d'une procédure stockée par
> > le biais de l'analyseur de requête, je pense parce qu'elle contient des
> > tables temporaires. Est-ce normal ? Y a-t-il une solution ?
> > Merci.


Avatar
Jean-Yves
Bonjour,
D'abord merci pour le coup de main.
Le query plan de la procédure stockée est fait par l'optimiseur de
l'analyseur de requêtes de SQLServer (aucun pb à l'exécution) et sur une
connexion 'sa'.

De plus la version est la suivante :
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05
Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows
NT 5.2 (Build 3790: )
ce qui correspond à SQLserver 2000 SP3a (car je suis en plein dépouillage de
la fixlist de SP4 avant de savoir si je l'installe ou non) sur une base
Windows Server 2003 Enterprise SP1, ce qui est correct.


"TLE91" a écrit :

Bonjour,
Je ne comprend pas car j'ai fait un copier/coller de votre code en exemple
et pas de problème pour moi !!
Quelle version de SQl Server utilisez-vous (Enterprise, Developpeur,
Standard ou MSDN) ? Pour être sûr vous pouvez faire SELECT @@VERSION sous
l'analyseur de requête et ensuite comparer le résultat avec la liste suivante
:
8.00.194 ==> Server 2000 RTM
8.00.384 ==> Server 2000 SP1
8.00.534 ==> Server 2000 SP2
8.00.760 ==> Server 2000 SP3
8.00.2039 ==> Server 2000 SP4

Autre point avec quel user utilisez-vous pour exécuter ce code ? Quels sont
ses droits ?

Cordialement.




"Jean-Yves" a écrit :

> Bonjour,
>
> J'ai fait le test suivant
> ------------------------------------------------
> CREATE PROCEDURE dbo.test AS
> begin
> create table #t(
> myid INT,
> mychar CHAR(4))
>
> insert into #t values(1, 'AAAA')
> insert into #t values(2, 'BBBB')
> insert into #t values(3, 'CCCC')
> insert into #t values(4, 'DDDD')
> insert into #t values(5, 'EEEE')
>
> select * from #t
> end
> GO
> ------------------------------------------------
> et j'ai l'erreur suivante :
> Serveur : Msg 208, Niveau 16, État 1, Procédure test, Ligne 7
> '#t' : nom d'objet incorrect.
>
> Je suppose que c'est l'utilisation du create table/insert qui pose problème,
> par opposition au select into. Pour info, j'ai fait le test avec
> insert...select au lieu de insert...values et ça donne le même résultat.
>
> Merci de la réponse.
> ------------------------------------------------
> "TLE91" a écrit :
>
> > Bonjour,
> > J'ai fait le test suivant
> > -------------------------------------------------------------------------------------------------
> > create proc _test
> > as
> > begin
> > select top 10 * into #t from t order by pk
> > select * from #t
> > end
> > go
> > exec _test
> > -------------------------------------------------------------------------------------------------
> > Si je demande le plab d'exécution sr "exec _test", je n'ai pas de problème
> > et je vois un plan pour chaqe instruction.
> > Si possible, pourriez-vous poster le code de votre proc pour affiner la
> > recherche.
> >
> > Cordialement.
> >
> > "Jean-Yves" a écrit :
> >
> > > Bonjour,
> > >
> > > Il m'est impossible d'obtenir le plan de requête d'une procédure stockée par
> > > le biais de l'analyseur de requête, je pense parce qu'elle contient des
> > > tables temporaires. Est-ce normal ? Y a-t-il une solution ?
> > > Merci.


Avatar
TLE91
Bonjour,

Je n'avais pas bien compris où se produisai le msg d'erreur !!! Je croyais
qu'il se produisait à l'exécution de la proc alors que c'est en réponse de la
demande du plan d'exécution. Du coup, cela s'explique ... En effet, pour
faire le plan d'exécution, Sql Server n'exécute pas "en vrai" le code. Ainsi,
le create table est analysé mais pas exécuter et donc l'objet table n'est pas
créé et l'exécution our analyse des ordre "insert ..." plante car analysé
unitairement l'objet table n'existe pas.

La solution pour connaître le plan d'exécution des requêtes INSERT serait de
créer une table hors proc puis de créer la proc sans le "create table". Une
fois le plan d'exécution validé vous réintroduisez le code du "create table".
C'est un peu lourd mais cela vous permets de valider le plan d'exec des
ordre DML.

Espérant vous avoir aidé.

Cordialement.

"Jean-Yves" a écrit :

Bonjour,
D'abord merci pour le coup de main.
Le query plan de la procédure stockée est fait par l'optimiseur de
l'analyseur de requêtes de SQLServer (aucun pb à l'exécution) et sur une
connexion 'sa'.

De plus la version est la suivante :
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05
Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows
NT 5.2 (Build 3790: )
ce qui correspond à SQLserver 2000 SP3a (car je suis en plein dépouillage de
la fixlist de SP4 avant de savoir si je l'installe ou non) sur une base
Windows Server 2003 Enterprise SP1, ce qui est correct.


"TLE91" a écrit :

> Bonjour,
> Je ne comprend pas car j'ai fait un copier/coller de votre code en exemple
> et pas de problème pour moi !!
> Quelle version de SQl Server utilisez-vous (Enterprise, Developpeur,
> Standard ou MSDN) ? Pour être sûr vous pouvez faire SELECT @@VERSION sous
> l'analyseur de requête et ensuite comparer le résultat avec la liste suivante
> :
> 8.00.194 ==> Server 2000 RTM
> 8.00.384 ==> Server 2000 SP1
> 8.00.534 ==> Server 2000 SP2
> 8.00.760 ==> Server 2000 SP3
> 8.00.2039 ==> Server 2000 SP4
>
> Autre point avec quel user utilisez-vous pour exécuter ce code ? Quels sont
> ses droits ?
>
> Cordialement.
>
>
>
>
> "Jean-Yves" a écrit :
>
> > Bonjour,
> >
> > J'ai fait le test suivant
> > ------------------------------------------------
> > CREATE PROCEDURE dbo.test AS
> > begin
> > create table #t(
> > myid INT,
> > mychar CHAR(4))
> >
> > insert into #t values(1, 'AAAA')
> > insert into #t values(2, 'BBBB')
> > insert into #t values(3, 'CCCC')
> > insert into #t values(4, 'DDDD')
> > insert into #t values(5, 'EEEE')
> >
> > select * from #t
> > end
> > GO
> > ------------------------------------------------
> > et j'ai l'erreur suivante :
> > Serveur : Msg 208, Niveau 16, État 1, Procédure test, Ligne 7
> > '#t' : nom d'objet incorrect.
> >
> > Je suppose que c'est l'utilisation du create table/insert qui pose problème,
> > par opposition au select into. Pour info, j'ai fait le test avec
> > insert...select au lieu de insert...values et ça donne le même résultat.
> >
> > Merci de la réponse.
> > ------------------------------------------------
> > "TLE91" a écrit :
> >
> > > Bonjour,
> > > J'ai fait le test suivant
> > > -------------------------------------------------------------------------------------------------
> > > create proc _test
> > > as
> > > begin
> > > select top 10 * into #t from t order by pk
> > > select * from #t
> > > end
> > > go
> > > exec _test
> > > -------------------------------------------------------------------------------------------------
> > > Si je demande le plab d'exécution sr "exec _test", je n'ai pas de problème
> > > et je vois un plan pour chaqe instruction.
> > > Si possible, pourriez-vous poster le code de votre proc pour affiner la
> > > recherche.
> > >
> > > Cordialement.
> > >
> > > "Jean-Yves" a écrit :
> > >
> > > > Bonjour,
> > > >
> > > > Il m'est impossible d'obtenir le plan de requête d'une procédure stockée par
> > > > le biais de l'analyseur de requête, je pense parce qu'elle contient des
> > > > tables temporaires. Est-ce normal ? Y a-t-il une solution ?
> > > > Merci.