Saya tahu saya terlambat ke pesta ini, tetapi untuk pengunjung masa depan, Martin benar. Kami mengalami masalah yang sama - SP berjalan sangat lambat untuk klien .NET, sementara itu sangat cepat untuk SSMS. Dalam mengeksplorasi dan menyelesaikan masalah, kami melakukan pengujian sistematis yang ditanyakan Kenny Evitt dalam komentarnya terhadap pertanyaan Martin.
Menggunakan varian kueri Martin, saya mencari SP di cache prosedur dan menemukan dua di antaranya. Melihat rencana-rencananya, faktanya adalah seseorang memiliki ARITHABORT ON dan satunya memiliki ARITHABORT OFF. Versi ARITHABORT OFF memiliki pencarian indeks sementara versi ARITHABORT ON menggunakan pemindaian indeks untuk output yang sama. Mengingat parameter yang terlibat, pencarian indeks akan membutuhkan pencarian pada puluhan juta catatan untuk output.
Saya membersihkan dua prosedur dari cache dan meminta klien .NET menjalankan SP lagi, menggunakan parameter yang sama (yang menampilkan rentang tanggal yang luas untuk pelanggan dengan banyak aktivitas). SP kembali secara instan. Rencana cache menggunakan pemindaian indeks yang sama yang sebelumnya ditampilkan dalam rencana ARITHABORT ON - tetapi kali ini rencana untuk OFF ARITHABORT. Kami menjalankan SP dengan parameter yang sama di SSMS, dan kembali mendapatkan hasil secara instan. Sekarang kita melihat bahwa rencana kedua di-cache, untuk ARITHABORT ON, dengan pemindaian indeks.
Kami kemudian membersihkan cache, menjalankan SP di SSMS dengan rentang tanggal yang sempit dan mendapatkan hasil instan. Kami menemukan bahwa rencana cache yang dihasilkan memiliki pencarian indeks, untuk output yang sama sebelumnya ditangani dengan pemindaian (yang juga merupakan pencarian dalam rencana asli dengan OFF ARITHABORT). Sekali lagi dari SSMS, kami menjalankan SP, kali ini dengan rentang tanggal lebar yang sama, dan melihat kinerja mengerikan yang sama dengan yang kami miliki dalam permintaan .NET asli.
Singkatnya, perbedaan itu tidak ada hubungannya dengan nilai sebenarnya dari ARITHABORT - dengan itu on atau off, dari salah satu klien, kita bisa mendapatkan kinerja yang dapat diterima atau mengerikan: Yang penting adalah nilai parameter yang digunakan dalam menyusun dan menyimpan rencana.
Sementara MSDN menunjukkan bahwa ARITHABORT OFF itu sendiri dapat memiliki dampak negatif pada optimisasi kueri, pengujian kami mengonfirmasi bahwa Martin benar - penyebabnya adalah sniffing parameter dan rencana yang dihasilkan tidak optimal untuk semua rentang parameter.