2009-05-28 6 views
0

Nous avons une procédure stockée SQL Server qui s'exécute correctement dans SQL Manager directement, fait un calcul assez volumineux, mais ne prend que 50-10 secondes max pour s'exécuter. Cependant, lorsque nous appelons cela à partir de l'application .NET via un adaptateur de données, il arrive à expiration. Le timeout se produit cependant avant que le délai d'attente ne le devienne, nous le réglons à 60 secondes et il expire encore dans environ 20 secondes ou moins. J'ai recherché le problème et ai vu d'autres personnes noter des problèmes où un SP fonctionne directement mais est lent via un appel de données..NET Data Adapter Timeout SP Issue

Des idées sur la façon de résoudre ce problème?

+0

Si vous configurez * un délai d'attente * et il est temporisation avant cet intervalle il semble lieke il y a un autre délai d'attente que vous n'êtes pas mise. Montrez * nous * le code. – JohnIdol

Répondre

0

Lorsque vous dites qu'il s'exécute correctement dans SSMS, voulez-vous dire que l'exécution de la procédure stockée fonctionne correctement ou que le SQL sous-jacent s'exécute correctement? D'après votre description, cela ressemble à un exemple de reniflage de paramètre. Fondamentalement, SQL Server a mis en cache un plan d'exécution optimal pour un ensemble de paramètres, mais exceptionnellement médiocre pour la plupart des autres.

Vous pouvez utiliser l'option RECOMPILE sur la requête dans votre procédure stockée pour forcer la recompilation à chaque exécution. Si cela n'est pas appelé fréquemment ou si la compilation ne prend pas longtemps, vous pouvez utiliser this trick.

L'autre solution consiste à copier les paramètres de procédure stockée dans des variables locales et à les utiliser dans la requête. Exemple:

CREATE PROCEDURE my_proc 
    @var1 INT 
AS 
    DECLARE @_var1 AS INT; 
    SET @_var1 = @var1; 

    SELECT col1, col2, col3 
    FROM t1 
    WHERE t1.pk = @_var1; 
+0

Dans SMSS, le SP s'exécute correctement chaque fois que nous l'essayons, en lui passant les params jsut comme nous le faisons via l'adaptateur de données .NET. Cependant, si je force le SP à recompiler, cela semble fonctionner pendant un certain temps sur le côté NET, peut-être que c'est peut-être un problème de mise en cache plan. D'une manière ou d'une autre, le dataadapter ou .NET devient comme il semble. –

0

Assurez-vous d'avoir vérifié tous vos délais d'attente. Je ne sais pas si vous utilisez asp.net ou WinForms, mais au moins les deux premiers de cette liste appliquerai:
Time out period not elapsed, but still timing out (see code)?

Une autre chose à vérifier est que vous configurez correctement vos paramètres. Le faire mal peut casser les index. L'endroit où j'ai vu cela est quand vous avez un index sur une colonne varchar qui est la clé de votre requête, et configurez votre paramètre pour cette colonne en utilisant un simple "AddWithValue()" ou une autre fonction qui ne définit pas explicitement le type. .Net vous donnera un paramètre nvarchar par défaut car les chaînes dans .Net sont unicode. Le résultat est qu'il ne sera pas en mesure d'utiliser l'index.

+0

L'application Winforms. Encore une fois, il fonctionne en SQL mais pas lorsqu'il est appelé via l'adaptateur de données. En plus, cela semble très incohérent, parfois cela peut fonctionner, d'autres fois, il est temps d'exécuter le même SP à partir de l'application et à différents moments. Je suis perdu quant à pourquoi à ce stade. –

+0

Vous pouvez indiquer à votre code .Net de retirer le plan d'exécution. Cela pourrait vous dire quelque chose. http://www.eggheadcafe.com/community/aspnet/2/55237/thanks-guysi-got-the-res.aspx –

0

Modifiez la propriété de délai d'attente de l'objet SqlConnection