Heim > Datenbank > MySQL-Tutorial > Warum ist meine SQL Server-Abfrage in SSMS schnell, in C#-Code jedoch langsam?

Warum ist meine SQL Server-Abfrage in SSMS schnell, in C#-Code jedoch langsam?

Barbara Streisand
Freigeben: 2025-01-05 14:59:42
Original
958 Leute haben es durchsucht

Why is My SQL Server Query Fast in SSMS but Slow in C# Code?

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.
    }
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage