2009-05-28 5 views
0

Wir haben eine gespeicherte SQL Server-Prozedur, die in SQL Manager direkt ausgeführt wird, macht eine ziemlich große Berechnung, dauert aber nur 50-10 Sekunden zum Ausführen..NET Data Adapter Timeout SP-Problem

Wenn wir dies jedoch von der .NET-App über einen Datenadapter aufrufen, kommt es zu einem Timeout. Die Zeitüberschreitung erfolgt jedoch vor Ablauf der Zeitüberschreitung, wir setzen sie auf 60 Sekunden und die Zeitüberschreitung in etwa 20 Sekunden oder weniger.

Ich habe das Problem gegoogled und andere Notiz Probleme gesehen, wo ein SP fien direkt funktioniert, ist aber langsam über einen Datenadapter Anruf.

Irgendwelche Ideen zur Lösung?

+0

Wenn Sie * a * Timeout sind Einstellung und es ist vor diesem Intervall eine Zeitüberschreitung dann klingt es lieke es eine andere Timeout ist sind Sie nicht einstellen. Zeigen Sie uns den Code. – JohnIdol

Antwort

0

Wenn Sie sagen, dass es in SSMS direkt läuft, meinst du, dass das Ausführen der gespeicherten Prozedur selbst läuft, oder dass die zugrunde liegende SQL läuft gut?

Aus Ihrer Beschreibung klingt dies wie ein Beispiel für Parameter-Sniffing. Im Grunde hat SQL Server einen Ausführungsplan zwischengespeichert, der für einen Parametersatz optimal ist, für die meisten anderen aber außergewöhnlich schlecht.

Sie können die RECOMPILE-Option für die Abfrage in Ihrer gespeicherten Prozedur verwenden, um die Neukompilierung bei jeder Ausführung zu erzwingen. Wenn dies nicht häufig aufgerufen wird oder die Kompilierung nicht lange dauert, können Sie this trick verwenden.

Die andere Lösung besteht darin, die gespeicherten Prozedurparameter in lokale Variablen zu kopieren und diese in der Abfrage zu verwenden. Beispiel:

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

In SMSS läuft die SP jedes Mal, wenn wir es versuchen, indem Sie es die Params jsut wie wir über den .NET-Datenadapter übergeben. Wenn ich jedoch zwinge, den SP neu zu kompilieren, dann scheint es auf der NET-Seite eine Weile zu funktionieren, vielleicht ist es vielleicht ein Plan, der Probleme zwischenspeichert. Irgendwie kommt der Datenadapter oder .NET in die Richtung, wie es scheint. –

0

Stellen Sie sicher, dass Sie alle Ihre Timeouts überprüft haben. Ich weiß nicht, ob Sie asp.net oder WinForms verwenden, aber zumindest die ersten beiden dieser Liste gilt:
Time out period not elapsed, but still timing out (see code)?

Eine andere Sache zu prüfen ist, dass Sie Ihre Parameter korrekt einrichten. Wenn Sie es falsch machen, können Sie die Indizes brechen. Die Stelle, die ich gesehen habe, ist, wenn Sie einen Index für eine varchar-Spalte haben, die der Schlüssel für Ihre Abfrage ist, und Ihren Parameter für diese Spalte mit einem einfachen "AddWithValue()" oder einer anderen Funktion einrichten, die nicht explizit die Art. .Net gibt Ihnen standardmäßig einen nvarchar Parameter, da Strings in .Net Unicode sind. Das Ergebnis ist, dass es den Index nicht verwenden kann.

+0

Winforms App. Erneut gibt es fien in SQL, aber nicht wenn er über datadapter aufgerufen wird. Darüber hinaus scheint es sehr inkonsequent, manchmal könnte es funktionieren, andere Zeiten, die es aus der gleichen Zeit aus der gleichen Zeit runnign der gleichen SP. Ich bin verloren, warum an dieser Stelle. –

+0

Sie können Ihren .Net-Code angeben, um den Ausführungsplan zurückzuziehen. Das könnte dir etwas sagen. http://www.eggheadcafe.com/community/aspnet/2/55237/thanks-guysi-got-the-res.aspx –

0

Ändern der Timeout-Eigenschaft des SqlConnection Objekt