OVH Cloud OVH Cloud

Bizarrerie de temps de réponse...

6 réponses
Avatar
Toff
Bonjour,

Situation : 2 serveurs A et B W2000 SQL2000SP3.

J'ai un comportement bizarre avec une fonction sur le serveur A qui ramène
une info du serveur distant B.

Voilà la fonction sur le serveur A :

CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
RETURNS VARCHAR(750)
AS
BEGIN

DECLARE @AlphaNumericCol VARCHAR(750)

SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable
WHERE Client_ID = @Client_Id AND Type_id='26')

RETURN @AlphaNumericCol

END

Quand j'exécute sur le serveur A :
select dbo.ft_SIRET('18750003800489'), la requête met 1min30
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Alors que si j'exécute directement la requête dans l'analyseur sur le
serveurA :
SELECT AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable
WHERE Client_ID = '18750003800489'AND Type_id='26'
La requête prend moins d' 1 seconde.............



Autre test, si je mets en dur dans la fonction, le client_Id :

ALTER FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
RETURNS VARCHAR(750)
AS
BEGIN

DECLARE @AlphaNumericCol VARCHAR(750)

SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable
WHERE Client_ID = '18750003800489' AND Type_id='26')

RETURN @AlphaNumericCol

END


Ce coup-ci, select dbo.ft_SIRET('18750003800489'), prend 1 seconde !

Je ne comprends pas ce qui peut se passer et pourquoi autant d'écart de perf
!!!! :o((

Quelqu'un peut-il m'éclairer ?

6 réponses

Avatar
Fred BROUARD
Essayez :


CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
RETURNS VARCHAR(750)
AS
BEGIN

IF @Client_Id IS NULL RETURN NULL

DECLARE @AlphaNumericCol VARCHAR(750)

SELECT @AlphaNumericCol = AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable T
WHERE T.Client_ID = @Client_Id
AND T.Type_id = '26'

RETURN @AlphaNumericCol

END


êtes vous sur du type VARCHAR(750) dans la définition de la colonne
AlphaNumericCol de la table ServeurB.LaBase.dbo.LaTable ?
Sinon cela force un transtypage implicite...

A +

Toff a écrit:
Bonjour,

Situation : 2 serveurs A et B W2000 SQL2000SP3.

J'ai un comportement bizarre avec une fonction sur le serveur A qui ramène
une info du serveur distant B.

Voilà la fonction sur le serveur A :

CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
RETURNS VARCHAR(750)
AS
BEGIN

DECLARE @AlphaNumericCol VARCHAR(750)

SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable
WHERE Client_ID = @Client_Id AND Type_id='26')

RETURN @AlphaNumericCol

END

Quand j'exécute sur le serveur A :
select dbo.ft_SIRET('18750003800489'), la requête met 1min30
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Alors que si j'exécute directement la requête dans l'analyseur sur le
serveurA :
SELECT AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable
WHERE Client_ID = '18750003800489'AND Type_id='26'
La requête prend moins d' 1 seconde.............



Autre test, si je mets en dur dans la fonction, le client_Id :

ALTER FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
RETURNS VARCHAR(750)
AS
BEGIN

DECLARE @AlphaNumericCol VARCHAR(750)

SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable
WHERE Client_ID = '18750003800489' AND Type_id='26')

RETURN @AlphaNumericCol

END


Ce coup-ci, select dbo.ft_SIRET('18750003800489'), prend 1 seconde !

Je ne comprends pas ce qui peut se passer et pourquoi autant d'écart de perf
!!!! :o((

Quelqu'un peut-il m'éclairer ?





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Toff
Merci de votre réponse mais cela ne change rien...
Je suis sûr du type VARCHAR(750) de la colonne.

Par contre, la même fonction créée sur une autre instance du serveur A
fonctionne correctement...

J'en perds mon latin ! :o(

Sur les 2 instances, le serveur lié distant est défini de la même manière,
avec le même mappage d'identité....


"Fred BROUARD" a écrit dans le message de
news:
Essayez :


CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
RETURNS VARCHAR(750)
AS
BEGIN

IF @Client_Id IS NULL RETURN NULL

DECLARE @AlphaNumericCol VARCHAR(750)

SELECT @AlphaNumericCol = AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable T
WHERE T.Client_ID = @Client_Id
AND T.Type_id = '26'

RETURN @AlphaNumericCol

END


êtes vous sur du type VARCHAR(750) dans la définition de la colonne
AlphaNumericCol de la table ServeurB.LaBase.dbo.LaTable ?
Sinon cela force un transtypage implicite...

A +

Toff a écrit:
> Bonjour,
>
> Situation : 2 serveurs A et B W2000 SQL2000SP3.
>
> J'ai un comportement bizarre avec une fonction sur le serveur A qui


ramène
> une info du serveur distant B.
>
> Voilà la fonction sur le serveur A :
>
> CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
> RETURNS VARCHAR(750)
> AS
> BEGIN
>
> DECLARE @AlphaNumericCol VARCHAR(750)
>
> SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
> FROM ServeurB.LaBase.dbo.LaTable
> WHERE Client_ID = @Client_Id AND Type_id='26')
>
> RETURN @AlphaNumericCol
>
> END
>
> Quand j'exécute sur le serveur A :
> select dbo.ft_SIRET('18750003800489'), la requête met 1min30
> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>
> Alors que si j'exécute directement la requête dans l'analyseur sur le
> serveurA :
> SELECT AlphaNumericCol
> FROM ServeurB.LaBase.dbo.LaTable
> WHERE Client_ID = '18750003800489'AND Type_id='26'
> La requête prend moins d' 1 seconde.............
>
>
>
> Autre test, si je mets en dur dans la fonction, le client_Id :
>
> ALTER FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
> RETURNS VARCHAR(750)
> AS
> BEGIN
>
> DECLARE @AlphaNumericCol VARCHAR(750)
>
> SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
> FROM ServeurB.LaBase.dbo.LaTable
> WHERE Client_ID = '18750003800489' AND Type_id='26')
>
> RETURN @AlphaNumericCol
>
> END
>
>
> Ce coup-ci, select dbo.ft_SIRET('18750003800489'), prend 1 seconde !
>
> Je ne comprends pas ce qui peut se passer et pourquoi autant d'écart de


perf
> !!!! :o((
>
> Quelqu'un peut-il m'éclairer ?
>
>

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************



Avatar
Philippe T [MS]
Bonjour,

Utilisez vous le même compte entre vos deux instances ? Etes-vous en
sécurité intégrés ?

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"Toff" <redtech(enlever cette parenthèse)@free.fr> wrote in message
news:%
Merci de votre réponse mais cela ne change rien...
Je suis sûr du type VARCHAR(750) de la colonne.

Par contre, la même fonction créée sur une autre instance du serveur A
fonctionne correctement...

J'en perds mon latin ! :o(

Sur les 2 instances, le serveur lié distant est défini de la même manière,
avec le même mappage d'identité....


"Fred BROUARD" a écrit dans le message de
news:
Essayez :


CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
RETURNS VARCHAR(750)
AS
BEGIN

IF @Client_Id IS NULL RETURN NULL

DECLARE @AlphaNumericCol VARCHAR(750)

SELECT @AlphaNumericCol = AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable T
WHERE T.Client_ID = @Client_Id
AND T.Type_id = '26'

RETURN @AlphaNumericCol

END


êtes vous sur du type VARCHAR(750) dans la définition de la colonne
AlphaNumericCol de la table ServeurB.LaBase.dbo.LaTable ?
Sinon cela force un transtypage implicite...

A +

Toff a écrit:
> Bonjour,
>
> Situation : 2 serveurs A et B W2000 SQL2000SP3.
>
> J'ai un comportement bizarre avec une fonction sur le serveur A qui


ramène
> une info du serveur distant B.
>
> Voilà la fonction sur le serveur A :
>
> CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
> RETURNS VARCHAR(750)
> AS
> BEGIN
>
> DECLARE @AlphaNumericCol VARCHAR(750)
>
> SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
> FROM ServeurB.LaBase.dbo.LaTable
> WHERE Client_ID = @Client_Id AND Type_id='26')
>
> RETURN @AlphaNumericCol
>
> END
>
> Quand j'exécute sur le serveur A :
> select dbo.ft_SIRET('18750003800489'), la requête met 1min30
> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>
> Alors que si j'exécute directement la requête dans l'analyseur sur le
> serveurA :
> SELECT AlphaNumericCol
> FROM ServeurB.LaBase.dbo.LaTable
> WHERE Client_ID = '18750003800489'AND Type_id='26'
> La requête prend moins d' 1 seconde.............
>
>
>
> Autre test, si je mets en dur dans la fonction, le client_Id :
>
> ALTER FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
> RETURNS VARCHAR(750)
> AS
> BEGIN
>
> DECLARE @AlphaNumericCol VARCHAR(750)
>
> SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
> FROM ServeurB.LaBase.dbo.LaTable
> WHERE Client_ID = '18750003800489' AND Type_id='26')
>
> RETURN @AlphaNumericCol
>
> END
>
>
> Ce coup-ci, select dbo.ft_SIRET('18750003800489'), prend 1 seconde !
>
> Je ne comprends pas ce qui peut se passer et pourquoi autant d'écart de


perf
> !!!! :o((
>
> Quelqu'un peut-il m'éclairer ?
>
>

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************







Avatar
Toff
Oui, même compte, sécu intégrée sur les deux instances...


"Philippe T [MS]" a écrit dans le message de
news:%
Bonjour,

Utilisez vous le même compte entre vos deux instances ? Etes-vous en
sécurité intégrés ?

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"Toff" <redtech(enlever cette parenthèse)@free.fr> wrote in message
news:%
> Merci de votre réponse mais cela ne change rien...
> Je suis sûr du type VARCHAR(750) de la colonne.
>
> Par contre, la même fonction créée sur une autre instance du serveur A
> fonctionne correctement...
>
> J'en perds mon latin ! :o(
>
> Sur les 2 instances, le serveur lié distant est défini de la même


manière,
> avec le même mappage d'identité....
>
>
> "Fred BROUARD" a écrit dans le message de
> news:
>> Essayez :
>>
>>
>> CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
>> RETURNS VARCHAR(750)
>> AS
>> BEGIN
>>
>> IF @Client_Id IS NULL RETURN NULL
>>
>> DECLARE @AlphaNumericCol VARCHAR(750)
>>
>> SELECT @AlphaNumericCol = AlphaNumericCol
>> FROM ServeurB.LaBase.dbo.LaTable T
>> WHERE T.Client_ID = @Client_Id
>> AND T.Type_id = '26'
>>
>> RETURN @AlphaNumericCol
>>
>> END
>>
>>
>> êtes vous sur du type VARCHAR(750) dans la définition de la colonne
>> AlphaNumericCol de la table ServeurB.LaBase.dbo.LaTable ?
>> Sinon cela force un transtypage implicite...
>>
>> A +
>>
>> Toff a écrit:
>> > Bonjour,
>> >
>> > Situation : 2 serveurs A et B W2000 SQL2000SP3.
>> >
>> > J'ai un comportement bizarre avec une fonction sur le serveur A qui
> ramène
>> > une info du serveur distant B.
>> >
>> > Voilà la fonction sur le serveur A :
>> >
>> > CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
>> > RETURNS VARCHAR(750)
>> > AS
>> > BEGIN
>> >
>> > DECLARE @AlphaNumericCol VARCHAR(750)
>> >
>> > SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
>> > FROM ServeurB.LaBase.dbo.LaTable
>> > WHERE Client_ID = @Client_Id AND Type_id='26')
>> >
>> > RETURN @AlphaNumericCol
>> >
>> > END
>> >
>> > Quand j'exécute sur le serveur A :
>> > select dbo.ft_SIRET('18750003800489'), la requête met 1min30
>> > !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>> >
>> > Alors que si j'exécute directement la requête dans l'analyseur sur le
>> > serveurA :
>> > SELECT AlphaNumericCol
>> > FROM ServeurB.LaBase.dbo.LaTable
>> > WHERE Client_ID = '18750003800489'AND Type_id='26'
>> > La requête prend moins d' 1 seconde.............
>> >
>> >
>> >
>> > Autre test, si je mets en dur dans la fonction, le client_Id :
>> >
>> > ALTER FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
>> > RETURNS VARCHAR(750)
>> > AS
>> > BEGIN
>> >
>> > DECLARE @AlphaNumericCol VARCHAR(750)
>> >
>> > SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
>> > FROM ServeurB.LaBase.dbo.LaTable
>> > WHERE Client_ID = '18750003800489' AND Type_id='26')
>> >
>> > RETURN @AlphaNumericCol
>> >
>> > END
>> >
>> >
>> > Ce coup-ci, select dbo.ft_SIRET('18750003800489'), prend 1 seconde !
>> >
>> > Je ne comprends pas ce qui peut se passer et pourquoi autant d'écart


de
> perf
>> > !!!! :o((
>> >
>> > Quelqu'un peut-il m'éclairer ?
>> >
>> >
>>
>> --
>> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage


SQL
>> Le site sur le langage SQL et les SGBDR :


http://sqlpro.developpez.com
>> Audit, conseil, expertise, formation, modélisation, tuning,


optimisation
>> ********************* http://www.datasapiens.com


***********************
>>
>
>




Avatar
Philippe T [MS]
Bonjour,

Et avec le profiler, on ne vois rien ?

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"Toff" <redtech(enlever cette parenthèse)@free.fr> wrote in message
news:%
Oui, même compte, sécu intégrée sur les deux instances...


"Philippe T [MS]" a écrit dans le message
de
news:%
Bonjour,

Utilisez vous le même compte entre vos deux instances ? Etes-vous en
sécurité intégrés ?

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"Toff" <redtech(enlever cette parenthèse)@free.fr> wrote in message
news:%
> Merci de votre réponse mais cela ne change rien...
> Je suis sûr du type VARCHAR(750) de la colonne.
>
> Par contre, la même fonction créée sur une autre instance du serveur A
> fonctionne correctement...
>
> J'en perds mon latin ! :o(
>
> Sur les 2 instances, le serveur lié distant est défini de la même


manière,
> avec le même mappage d'identité....
>
>
> "Fred BROUARD" a écrit dans le message de
> news:
>> Essayez :
>>
>>
>> CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
>> RETURNS VARCHAR(750)
>> AS
>> BEGIN
>>
>> IF @Client_Id IS NULL RETURN NULL
>>
>> DECLARE @AlphaNumericCol VARCHAR(750)
>>
>> SELECT @AlphaNumericCol = AlphaNumericCol
>> FROM ServeurB.LaBase.dbo.LaTable T
>> WHERE T.Client_ID = @Client_Id
>> AND T.Type_id = '26'
>>
>> RETURN @AlphaNumericCol
>>
>> END
>>
>>
>> êtes vous sur du type VARCHAR(750) dans la définition de la colonne
>> AlphaNumericCol de la table ServeurB.LaBase.dbo.LaTable ?
>> Sinon cela force un transtypage implicite...
>>
>> A +
>>
>> Toff a écrit:
>> > Bonjour,
>> >
>> > Situation : 2 serveurs A et B W2000 SQL2000SP3.
>> >
>> > J'ai un comportement bizarre avec une fonction sur le serveur A qui
> ramène
>> > une info du serveur distant B.
>> >
>> > Voilà la fonction sur le serveur A :
>> >
>> > CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
>> > RETURNS VARCHAR(750)
>> > AS
>> > BEGIN
>> >
>> > DECLARE @AlphaNumericCol VARCHAR(750)
>> >
>> > SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
>> > FROM ServeurB.LaBase.dbo.LaTable
>> > WHERE Client_ID = @Client_Id AND Type_id='26')
>> >
>> > RETURN @AlphaNumericCol
>> >
>> > END
>> >
>> > Quand j'exécute sur le serveur A :
>> > select dbo.ft_SIRET('18750003800489'), la requête met 1min30
>> > !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>> >
>> > Alors que si j'exécute directement la requête dans l'analyseur sur
>> > le
>> > serveurA :
>> > SELECT AlphaNumericCol
>> > FROM ServeurB.LaBase.dbo.LaTable
>> > WHERE Client_ID = '18750003800489'AND Type_id='26'
>> > La requête prend moins d' 1 seconde.............
>> >
>> >
>> >
>> > Autre test, si je mets en dur dans la fonction, le client_Id :
>> >
>> > ALTER FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
>> > RETURNS VARCHAR(750)
>> > AS
>> > BEGIN
>> >
>> > DECLARE @AlphaNumericCol VARCHAR(750)
>> >
>> > SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
>> > FROM ServeurB.LaBase.dbo.LaTable
>> > WHERE Client_ID = '18750003800489' AND Type_id='26')
>> >
>> > RETURN @AlphaNumericCol
>> >
>> > END
>> >
>> >
>> > Ce coup-ci, select dbo.ft_SIRET('18750003800489'), prend 1 seconde !
>> >
>> > Je ne comprends pas ce qui peut se passer et pourquoi autant d'écart


de
> perf
>> > !!!! :o((
>> >
>> > Quelqu'un peut-il m'éclairer ?
>> >
>> >
>>
>> --
>> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage


SQL
>> Le site sur le langage SQL et les SGBDR :


http://sqlpro.developpez.com
>> Audit, conseil, expertise, formation, modélisation, tuning,


optimisation
>> ********************* http://www.datasapiens.com


***********************
>>
>
>








Avatar
Ch.
si quand vous mettez le id_client client ca va vite !
faut peux etre creuser dans ce sens non ?

le id_client est'il indexé ?
y'a t'il des verrous ?

si c'est uniquement un select de recup et que le contexte n'est pas
dangereux !
voir sur des moyens plus radicaux style with_nolock !

autre detail j'ai constaté des lattence sur des tables quand celles ci sont
ouvertes dans l'entreprise manager !
A verifier que toutes les interfaces sont bien fermées !





"Toff" <redtech(enlever cette parenthèse)@free.fr> a écrit dans le message
de news:
Bonjour,

Situation : 2 serveurs A et B W2000 SQL2000SP3.

J'ai un comportement bizarre avec une fonction sur le serveur A qui ramène
une info du serveur distant B.

Voilà la fonction sur le serveur A :

CREATE FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
RETURNS VARCHAR(750)
AS
BEGIN

DECLARE @AlphaNumericCol VARCHAR(750)

SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable
WHERE Client_ID = @Client_Id AND Type_id='26')

RETURN @AlphaNumericCol

END

Quand j'exécute sur le serveur A :
select dbo.ft_SIRET('18750003800489'), la requête met 1min30
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Alors que si j'exécute directement la requête dans l'analyseur sur le
serveurA :
SELECT AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable
WHERE Client_ID = '18750003800489'AND Type_id='26'
La requête prend moins d' 1 seconde.............



Autre test, si je mets en dur dans la fonction, le client_Id :

ALTER FUNCTION ft_SIRET(@Client_Id VARCHAR(24))
RETURNS VARCHAR(750)
AS
BEGIN

DECLARE @AlphaNumericCol VARCHAR(750)

SELECT @AlphaNumericCol = (SELECT AlphaNumericCol
FROM ServeurB.LaBase.dbo.LaTable
WHERE Client_ID = '18750003800489' AND Type_id='26')

RETURN @AlphaNumericCol

END


Ce coup-ci, select dbo.ft_SIRET('18750003800489'), prend 1 seconde !

Je ne comprends pas ce qui peut se passer et pourquoi autant d'écart de
perf
!!!! :o((

Quelqu'un peut-il m'éclairer ?