Kode Anda di SSMS bukan kode yang sama dengan yang Anda jalankan di aplikasi Anda. Baris ini di aplikasi Anda menambahkan parameter NVARCHAR:
ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
sementara di skrip SSMS Anda mendeklarasikannya sebagai VARCHAR:
declare @clientID varchar(200)
Karena aturan Prioritas Jenis Data Where client_id = @clientID
ekspresi dalam kueri Anda tidak dapat di-SARG di mana @clientID
bertipe NVARCHAR (Saya membuat lompatan keyakinan dan berasumsi bahwa client_id
kolom bertipe VARCHAR). Aplikasi dengan demikian memaksa pemindaian tabel di mana kueri SSMS dapat melakukan pencarian kunci cepat. Ini adalah masalah yang diketahui dan dipahami dengan baik dengan menggunakan Parameters.AddWithValue dan telah dibahas di banyak artikel sebelumnya, misalnya. lihat Bagaimana Kode Akses Data Mempengaruhi Kinerja Basis Data. Setelah masalahnya dipahami, solusinya menjadi sepele:
-
tambahkan parameter dengan konstruktor yang menerima tipe:
Parameters.Add("@clientID", SqlDbType.Varchar, 200)
(dan lakukan berikan panjang eksplisit untuk mencegah polusi cache, lihat Performa kueri dan rencanakan masalah cache saat panjang parameter tidak ditentukan dengan benar -
atau berikan parameter dalam teks SQL:
where client_id = cast(@clientID as varchar(200))
.
Solusi pertama lebih unggul karena memecahkan masalah polusi cache selain masalah kemampuan SARG.
Saya juga merekomendasikan Anda membaca Lambat di Aplikasi, Cepat di SSMS? Memahami Misteri Performa