Abweichung der Abfrageleistung im Code vs. SSMS
Eine Abfrage, die in SQL Server Management Studio (SSMS) reibungslos ausgeführt wird, kann übermäßig langsam sein, wenn im Code ausgeführt. Diese Diskrepanz, die während einer kürzlichen Codeentwicklung festgestellt wurde, veranlasste eine Untersuchung der zugrunde liegenden Ursache.
Code-Implementierung
Der zum Ausführen der Abfrage verwendete C#-Code lautet wie folgt:
using (var conn = new SqlConnection("Data Source=backend.example.com;...")) { using (var ada = new SqlDataAdapter(sqlCommand, conn)) { ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID); ada.SelectCommand.Parameters.AddWithValue("@dt", dtpFilter.Value); conn.Open(); Logs.Clear(); ada.Fill(Logs); // Time out exception for 30 sec limit. } }
SSMS-Abfrage
Die identische Abfrage, extrahiert aus dem C#-Code wird direkt in SSMS ausgeführt:
SELECT [PK_JOB],[CLIENT_ID],[STATUS],[LOG_NAME],dt FROM [ES_HISTORY] inner join [es_history_dt] on [PK_JOB] = [es_historyid] Where client_id = @clientID and dt > @dt and (job_type > 4 or job_type = 0 or job_type = 1 or job_type = 4 ) Order by dt desc
Analyse
Bei der Prüfung besteht ein subtiler Unterschied zwischen den beiden Abfragen. In der SSMS-Version wird der @clientID-Parameter als VARCHAR deklariert, während er im C#-Code mithilfe der AddWithValue-Methode hinzugefügt wird, die den Datentyp normalerweise basierend auf dem Typ der .NET-Variablen zuweist. In diesem Fall ist die ClientID-Variable vom Typ string, der in SQL Server NVARCHAR zugeordnet ist.
Auswirkungen
Dieser Unterschied hat erhebliche Auswirkungen auf die Abfrageleistung. Der Parametertyp NVARCHAR ermöglicht keine SARG-Filterung (Search Argument), eine wichtige Optimierungstechnik, die SQL Server verwendet, um Zeilen basierend auf indizierten Spalten schnell zu finden. Dadurch wird die Abfrage im C#-Code gezwungen, einen Tabellenscan durchzuführen, der weitaus weniger effizient ist als eine Indexsuche.
Lösung
Um das Problem zu beheben Bei Abweichungen ist es erforderlich, den Datentyp VARCHAR für den Parameter @clientID im C#-Code explizit anzugeben. Dies kann mit der folgenden Syntax erreicht werden:
ada.SelectCommand.Parameters.Add("@clientID", SqlDbType.VarChar, 200).Value = ClientID;
Indem sichergestellt wird, dass die Datentypen der Parameter mit denen in der SSMS-Abfrage übereinstimmen, kann die Anwendung die Leistungseinbußen vermeiden und die Abfrage in einem Zeitrahmen ausführen. effiziente Art und Weise.
Das obige ist der detaillierte Inhalt vonWarum ist meine SQL Server-Abfrage in SSMS schnell, in C#-Code jedoch langsam?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!