Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan Pelayan SQL Saya Pantas dalam SSMS tetapi Lambat dalam Kod C#?
Percanggahan Prestasi Pertanyaan dalam Kod lwn. SSMS
Pertanyaan yang berfungsi dengan lancar dalam SQL Server Management Studio (SSMS) mungkin menunjukkan kelembapan yang berlebihan apabila dilaksanakan dalam kod. Percanggahan ini, yang ditemui semasa pembangunan kod baru-baru ini, mendorong penyiasatan terhadap punca asas.
Pelaksanaan Kod
Kod C# yang digunakan untuk menjalankan pertanyaan adalah seperti berikut:
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 Pertanyaan
Pertanyaan yang sama, yang diekstrak daripada kod C#, dijalankan terus dalam SSMS:
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
Analisis
Setelah peperiksaan , perbezaan halus wujud antara kedua-dua pertanyaan. Dalam versi SSMS, parameter @clientID diisytiharkan sebagai VARCHAR, manakala dalam kod C#, ia ditambah menggunakan kaedah AddWithValue, yang biasanya menetapkan jenis data berdasarkan jenis pembolehubah .NET. Dalam kes ini, pembolehubah ClientID adalah daripada jenis rentetan, yang dipetakan kepada NVARCHAR dalam SQL Server.
Impak
Perbezaan ini mempunyai kesan yang ketara pada prestasi pertanyaan. Jenis parameter NVARCHAR tidak membenarkan penapisan Argumen Carian (SARG), teknik pengoptimuman penting yang SQL Server gunakan untuk mencari baris dengan cepat berdasarkan lajur yang diindeks. Akibatnya, pertanyaan dalam kod C# terpaksa melakukan imbasan jadual, yang jauh kurang cekap daripada pencarian indeks.
Penyelesaian
Untuk menyelesaikan masalah percanggahan, adalah perlu untuk menyatakan secara eksplisit jenis data VARCHAR untuk parameter @clientID dalam kod C#. Ini boleh dicapai menggunakan sintaks berikut:
ada.SelectCommand.Parameters.Add("@clientID", SqlDbType.VarChar, 200).Value = ClientID;
Dengan memastikan jenis data parameter sepadan dengan yang diisytiharkan dalam pertanyaan SSMS, aplikasi boleh mengelakkan penalti prestasi dan melaksanakan pertanyaan dalam masa- cara yang cekap.
Atas ialah kandungan terperinci Mengapa Pertanyaan Pelayan SQL Saya Pantas dalam SSMS tetapi Lambat dalam Kod C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!