2009-07-03 14 views
1

Dies ist keine Frage zum Optimieren eines SQL-Befehls. Ich frage mich, welche Wege es gibt, um sicherzustellen, dass eine SQL-Verbindung geöffnet und bereit ist, einen Befehl so effizient wie möglich zu behandeln.Optimierung der SQL-Verbindungsleistung?

Was ich gerade sehe ist, ich kann einen SQL-Befehl ausführen und dieser Befehl dauert ~ 1s, zusätzliche Ausführungen werden ~ 300ms dauern. Dies ist der Fall, nachdem der Befehl zuvor für den SQL-Server ausgeführt wurde (von einer anderen Anwendungsinstanz) ... daher sollte der SQL-Cache für die ausgeführte Abfrage vor der ersten Ausführung dieser Anwendungen vollständig gefüllt sein. Solange ich die Abfrage kontinuierlich wiederhole, sehe ich Zeiten von ungefähr 300 ms, aber wenn ich die Anwendung für 5-10 Minuten im Leerlauf belasse und zurückkehre, wird die nächste Anfrage wieder auf ~ 1s zurückgesetzt (genau wie die erste Anfrage).

Gibt es eine Möglichkeit, über die Verbindungszeichenfolge oder eine Eigenschaft auf der SqlConnection direkt das Framework, um die Verbindung hydratisiert und bereit für die effiziente Bearbeitung von Abfragen zu halten?

Antwort

0

Sie halten es offen, indem Sie es nicht schließen. :) Aber das ist nicht empfehlenswert, da das Verbindungs-Pooling das Verbindungsmanagement für Sie übernimmt. Hast du es aktiviert?

+0

Es ist standardmäßig aktiviert. –

2

Haben Sie den Ausführungsplan für Ihre Verfahren überprüft? Ich glaube, dass Ausführungspläne auf dem Server in den Speicher geladen werden und dann nach bestimmten Zeiträumen oder abhängig davon, auf welche Tabellen usw. in den Prozeduren zugegriffen wird, gelöscht werden. Wir hatten Fälle, in denen das Vereinfachen gespeicherter Prozeduren (vielleicht die Aufteilung) den Arbeitsaufwand, den der Datenbankserver bei der Berechnung der Pläne zu leisten hat, reduziert ... und letztendlich den ersten Aufruf der Prozedur reduziert ... Sie können Befehle an ... ausführen erzwingt das erneute Kompilieren gespeicherter Prozeduren, um zu testen, ob die anfängliche Anrufzeit reduziert wird ... Wir hatten Fälle, in denen die Komplexität einer gespeicherten Prozedur dazu führte, dass der Datenbankserver basierend auf verschiedenen Parametern ständig neu kompiliert werden musste Das Aufspalten des SP oder das Vereinfachen großer select-Anweisungen in multiple update-Anweisungen usw. hat erheblich dazu beigetragen.

andere Ideen rufen vielleicht gelegentlich ein einfaches getDate() oder ähnliches auf, so dass der SQL-Server wach ist (hoffe, dass das Sinn macht) ... ähnlich wie eine ASP.net-App im Speicher in IIS zu halten .

0

Standardmäßig ist das Verbindungs-Pooling in ADO .NET aktiviert. Dies erfolgt über die Verbindungszeichenfolge, die von der Anwendung verwendet wird. Weitere Informationen in Using Connection Pooling with SQL Server

0

Wenn Sie mehr als eine Datenbankverbindung verwenden, kann es effizienter sein. Mit einer Datenbankverbindung wird die bestmögliche Zugriffsgeschwindigkeit immer sequenziell begrenzt. Wenn Sie> 1 Verbindungen haben, gibt es für Ihren Compiler die Möglichkeit, den gleichzeitigen Zugriff ein wenig mehr zu optimieren. Ich nehme an, dass Sie .NET verwenden.

Auch wenn Sie die gleiche SQL-Anweisung wiederholt Ausgabe, seine möglichen Datenbankserver das Ergebnis für einen kurzen Zeitraum ist das Caching, also die Rückkehr des Suchresultates schneller zu machen ..

1

Der Standardwert für offene Verbindungen in einem .NET-Verbindungspool ist Null.

Sie können diesen Wert in der Verbindungszeichenfolge auf 1 einzustellen oder mehr:

"data source=dbserver;...Asynchronous Processing=true;Min Pool Size=1" 

Sehen Sie mehr über diese options in MSDN.