Rumah > pangkalan data > tutorial mysql > Mengapa Pertanyaan Pelayan SQL Saya Pantas dalam SSMS tetapi Lambat dalam Kod C#?

Mengapa Pertanyaan Pelayan SQL Saya Pantas dalam SSMS tetapi Lambat dalam Kod C#?

Barbara Streisand
Lepaskan: 2025-01-05 14:59:42
asal
926 orang telah melayarinya

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

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.
    }
}
Salin selepas log masuk

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
Salin selepas log masuk

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;
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan