Jadi kode C# Anda mengirimkan kueri SQL ad hoc ke SQL Server, menggunakan metode apa? Sudahkah Anda mempertimbangkan untuk menggunakan prosedur tersimpan? Itu mungkin akan memastikan kinerja yang sama (setidaknya di mesin) terlepas dari siapa yang menyebutnya.
Mengapa? Pengaturan ARITHABORT adalah salah satu hal yang dilihat pengoptimal saat menentukan cara menjalankan kueri Anda (lebih khusus lagi, untuk pencocokan paket). Ada kemungkinan bahwa paket dalam cache memiliki pengaturan yang sama dengan SSMS, jadi paket tersebut menggunakan paket yang di-cache, tetapi dengan pengaturan yang berlawanan, kode C# Anda memaksa kompilasi ulang (atau mungkin Anda benar-benar BAD plan di cache), yang tentu saja dapat merusak kinerja dalam banyak kasus.
Jika Anda sudah memanggil prosedur tersimpan (Anda tidak memposting kueri Anda, meskipun saya pikir Anda bermaksud demikian), Anda dapat mencoba menambahkan OPTION (RECOMPILE) ke kueri (atau kueri) yang menyinggung dalam prosedur tersimpan. Ini berarti pernyataan-pernyataan itu akan selalu dikompilasi ulang, tetapi itu bisa mencegah penggunaan rencana buruk yang tampaknya Anda lakukan. Pilihan lainnya adalah memastikan bahwa ketika prosedur tersimpan dikompilasi, batch dijalankan dengan SET ARITHABORT ON.
Akhirnya, Anda sepertinya bertanya bagaimana Anda dapat mengubah pengaturan ARITHABORT di SSMS. Saya pikir yang ingin Anda tanyakan adalah bagaimana Anda dapat memaksa pengaturan ARITHABORT dalam kode Anda. Jika Anda memutuskan untuk terus mengirim SQL ad hoc dari aplikasi C# Anda, tentu saja Anda dapat mengirim perintah sebagai teks yang memiliki beberapa pernyataan yang dipisahkan oleh titik koma, misalnya:
SET ARITHABORT ON; SELECT ...
Untuk info lebih lanjut tentang mengapa masalah ini terjadi, lihat artikel hebat Erland Sommarskog:
- Aplikasi Lambat, SSMS Cepat? Memahami Misteri Performa