2009-07-22 8 views
1

ich eine Abfrage direkt am Laufen, es in der Natur ist trivial:Dataset Zeiten, während Abfrage wird sofort

SELECT * FROM [dbo].[vwUnloadedJobDetailsWithData] WHERE JobId = 36963 

Als ich das von Management Studio der Abfrage dauert nicht einmal eine Sekunde. Wenn ich es innerhalb des Tabellenadapters laufe, überschreitet es das Zeitlimit. Ich habe das mehrere Male behoben, aber die Lösung ist lächerlich. Wenn ich den Tabellenadapter aus meiner xsd-Datei lösche und ihn neu erstelle, entspricht die Abfragezeit etwa zwei Tagen der von Management Studio, aber ich muss sie erneut bereitstellen, was asinine ist.

Jeder Einblick in was könnte dies verursachen würde sehr geschätzt werden. Ich habe eine andere Frage zu diesem Thema gesehen, aber die Lösung mit set arithabort on vor der Abfrage hatte keine Auswirkung auf mich.

Edit: Es wurde gefragt, dass ich meinen Code für den Aufruf der Abfrage zeigen. Nun geschieht dies, wenn ich in meine XSD-Datei gehen und nur Datenvorschau auch, aber aus Gründen der Klarheit, hier ist es:

using (TEAMSConnection connection = new TEAMSConnection()) 
{ 
    connection.OpenConnection(); 

    _JobDetailsDAO jobDetailDao= new _JobDetailsDAO(connection); 
    return jobDetailDao.GetUnloadedJobDetailsByJobId(jobId); 

} 

Bei der Entsorgung der Verbindung der Datenbankverbindung geschlossen ist. mit dieser Codezeile:

if (_DBConnection != null && _DBConnection.State == ConnectionState.Open) 
    _DBConnection.Close();  

Edit2: Ich habe eine Spur lief und hier die eingestellten Optionen, die

set quoted_identifier auf Satz ARITHABORT off Satz NUMERIC_ROUNDABORT off Satz ANSI_WARNINGS auf Satz gesetzt werden ANSI_PADDING auf Satz ansi_nulls auf Satz CONCAT_NULL_YIELDS_NULL auf Satz Satz implicit_transactions off eingestellte Sprache us_english CURSOR_CLOSE_ON_COMMIT off set date mdy datefirst 7 Satz Transaktionsisolationsstufe Lese

begangenen

Ich ging hin und fügte hinzu, dass auf die Abfrage, die ich im Management Studio generiert und es lief immer noch in weniger als einer Sekunde. Ich habe sogar die Abfrage genau wie in der Spur kopiert.

exec sp_executesql N'SELECT * FROM [dbo].[vwUnloadedJobDetailsWithData] WHERE JobID = @JobId',N'@JobId int',@JobId=36963 

und es ist immer noch weniger als eine Sekunde Rückkehrzeit. Ich bin so sehr verwirrt.

Danke, Josh

+0

Es klingt, als würden Sie Ihre db-Verbindungen nicht schließen, aber es ist schwer zu wissen, was passiert, weil Sie den C# -Code nicht geteilt haben. –

+0

Entschuldigung, es gibt nicht viel Code zu teilen ..... soweit sie die Verbindung schließen, werden sie definitiv geschlossen. Ich werde meine Abfrage und die Verbindungsbehandlung für diese Abfrage posten, wenn Sie meinen, dass dies hilfreich wäre. – joshlrogers

Antwort

0

die wahrscheinlichste scenarion, warum dies geschieht würde der Unterschied in SET-Optionen zwischen SSMS und ado.net. Dieser Unterschied verursacht (Neu-) Aufbau von Ausführungsplänen, die möglicherweise nicht optimal sind.

+0

Ich habe die Set-Optionen hinzugefügt, siehst du irgendwas, das irgendwelche Ideen auslöst? – joshlrogers

0

Okay, nun, ich konnte keine Lösung finden, die mir weiterhin erlauben würde, das Dataset zu verwenden, also ging ich direkt zur Verwendung des SqlDataAdapter im Code, anstatt die automatisch generierten TableAdapter zu verwenden.

Entsprechend der Ablaufverfolgung führt es die genau gleiche Abfrage durch, aber bis jetzt funktioniert es. Es mag nicht in zwei Tagen, aber für jetzt scheint es funktioniert.

0

Nur versuchen, laut zu denken: Vielleicht gibt es eine Sperre durch einen anderen Prozess/Person verursacht? Gibt es jemanden, der die gleiche Zeile gleichzeitig aktualisiert? Gibt es jemanden, der den Tisch von Management Studio oder Query Analyzer mit Open Table-Funktion öffnet und mit den Filtern spielt? Versuchen Sie suchen für Schlösser mit sp_who2

0

Einige Gedanken:

Was ich Parameter nennen würde für gespeicherte Prozedur Sniffing. Versuchen Sie, die OPTION (RECOMPILE) Hinweis, so dass Ihre gesendeten SQL sieht wie folgt aus:

exec sp_executesql 
    N'SELECT * 
     FROM [dbo].[vwUnloadedJobDetailsWithData] 
     WHERE JobID = @JobId 
     OPTION (RECOMPILE)', 
    N'@JobId int', 
    @JobId=36963 

Erläuterung: Wenn ein Abfrage-Plan erzeugt wird, und im Cache gespeichert, kann es eine schlechte, atypische Wert sein. Sage JobID ist normalerweise sehr selektiv, aber für diese eine Ausführung ist es nicht. Wenn Sie die Abfrage den nächsten Plan ausführen, ist der zwischengespeicherte Plan für die nächste selektive JobId falsch. Ein Plan wird aus verschiedenen Gründen neu kompiliert, aber der Wert für die Neukompilierung ist wichtig.

Sonst, was ist der genaue Datentyp von Jobid? Wenn es smallint ist, wird die Spalte in der parametrisierten Abfrage in int konvertiert. Wenn eine Konstante verwendet wird, wird es smallint. Stellen Sie sicher, dass der Typ korrekt definiert ist: Dies ist im SQL-Code von Bedeutung.

Verwandte Themen