Sedikit tanggal, tetapi bagi siapa pun yang berakhir di sini dengan masalah yang sama ...
Saya memiliki masalah yang sama. Bagi saya itu ternyata menjadi parameter sniffing, yang pada awalnya saya tidak cukup mengerti untuk peduli. Saya menambahkan 'set arithabort on' yang memperbaiki masalah tetapi kemudian kembali. Lalu saya membaca:
http://www.sommarskog.se/query-plan-mysteries.html
Itu dibersihkan - semuanya - up. Karena saya menggunakan Linq ke SQL dan memiliki opsi terbatas untuk memperbaiki masalah ini, saya akhirnya menggunakan panduan rencana kueri (lihat ujung tautan) untuk memaksa rencana kueri yang saya inginkan.
Aplikasi .NET terhubung dengan opsi yang dinonaktifkan secara default, tetapi diaktifkan secara default di Management Studio. Hasilnya adalah server benar-benar melakukan cache 2 rencana eksekusi terpisah untuk sebagian besar / semua prosedur. Ini memengaruhi cara server melakukan perhitungan numerik dan karenanya Anda bisa mendapatkan hasil yang sangat berbeda tergantung pada prosedurnya. Ini benar-benar hanya satu dari 2 cara umum yang bisa dilakukan oleh seorang proc untuk mendapatkan rencana eksekusi yang mengerikan, yang lainnya adalah mengendus parameter.
Lihatlah https://web.archive.org/web/20150315031719/http://sqladvice.com/blogs/gstark/archive/2008/02/12/Arithabort-Option-Effects-Stored-Procedure-Performance. aspx untuk sedikit lebih banyak diskusi tentangnya.
sumber
SET
opsi mendapatkan rencana yang lebih baik dan salah mendiagnosis ini sebagai Opsi itu sendiri yang salah. Saya tidak yakin pria di tautan Anda belum melakukan ini.Saya berpendapat bahwa ini hampir pasti parameter sniffing.
Sering dinyatakan bahwa
SET OPTIONS
dapat memengaruhi kinerja dengan cara ini, tetapi saya belum melihat satu sumber otoritatif untuk klaim ini kecuali untuk kasus di mana Anda menggunakan tampilan yang diindeks / kolom yang dihitung yang diindeks.Dalam hal ini (untuk SQL2005 + dan kecuali database Anda dalam mode kompatibilitas SQL2000 ). Jika Anda memiliki keduanya
ARITHABORT
danANSI_WARNINGS
OFF
kemudian Anda akan menemukan indeks tidak digunakan sehingga mungkin memiliki scan daripada pencarian yang diinginkan (dan beberapa overhead karena hasil perhitungan tetap tidak dapat digunakan). ADO.NET tampaknya default untuk memilikiANSI_WARNINGS ON
dari tes cepat yang baru saja saya lakukan.Klaim dalam jawaban Ben bahwa "cara server melakukan perhitungan numerik" dapat menambahkan menit ke hasil yang kalau tidak akan memakan waktu kurang dari sedetik sepertinya tidak masuk akal bagi saya. Saya pikir apa yang cenderung terjadi adalah bahwa setelah menyelidiki masalah kinerja kinerja Profiler digunakan untuk mengidentifikasi permintaan yang menyinggung. Ini disisipkan ke studio manajemen dan menjalankan dan mengembalikan hasil secara instan. Satu-satunya perbedaan yang jelas antara koneksi adalah
ARITH_ABORT
opsi.Tes cepat di jendela studio manajemen menunjukkan bahwa ketika
SET ARITHABORT OFF
dinyalakan dan permintaan dijalankan bahwa masalah kinerja berulang sehingga ternyata kasus ditutup. Memang ini tampaknya merupakan metodologi pemecahan masalah yang digunakan dalam tautan Gregg Stark .Namun itu mengabaikan fakta bahwa dengan set opsi yang Anda dapat akhirnya mendapatkan paket buruk yang sama persis dari cache .
Penggunaan kembali paket ini dapat terjadi bahkan jika Anda masuk sebagai pengguna yang berbeda dari penggunaan koneksi aplikasi.
Saya menguji ini dengan menjalankan kueri pengujian pertama dari aplikasi web kemudian dari studio manajemen dengan
SET ARITHABORT OFF
dan bisa melihat jumlah pengguna naik dari kueri di bawah ini.Agar pembagian ini, pf rencana untuk benar-benar terjadi semua kunci cache rencana harus sama. Selain
arithabort
itu sendiri beberapa contoh lainnya adalah pengguna yang mengeksekusi memerlukan skema default yang sama (jika permintaan bergantung pada resolusi nama implisit) dan koneksi memerlukanlanguage
set yang sama .Daftar lengkap kunci cache rencana di sini
sumber
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.
sumber
Setting ARITHABORT to OFF can negatively impact query optimization leading to performance issues.
arti ungkapan itu . Apakah mereka hanya berbicara tentang ketidakmampuan untuk menggunakan indeks pada kolom dan tampilan yang dihitung (jikaANSI_WARNINGS
juga mati) atau jika memang memiliki beberapa efek lainnya.Baru saja mengalami masalah ini. Seperti yang dikatakan orang di sini, akar penyebabnya adalah beberapa rencana kueri, salah satunya adalah kurang optimal. Saya hanya ingin memverifikasi bahwa ARITHABORT memang dapat menyebabkan masalah dengan sendirinya (karena permintaan saya mengalami masalah dengan tidak memiliki parameter, yang mengeluarkan parameter sniffing dari persamaan).
sumber
Ini mengingatkan saya pada masalah yang persis sama yang saya alami di sql server 2008 hari. Dalam kasus kami, kami tiba-tiba menemukan satu pekerjaan persegi tiba-tiba melambat (biasanya beberapa detik, dan sekarang 9+ menit), pekerjaan itu perlu mengakses server yang ditautkan, kami menambahkan set ARITHABORT pada langkah pekerjaan, dan sepertinya masalahnya dipecahkan selama beberapa hari dan kemudian dikembalikan.
Kami kemudian membuka tiket dengan dukungan MS, dan pada awalnya mereka tidak dapat menemukan keduanya, dan tiket tersebut ditingkatkan ke tim PFE yang sangat senior, dan dua dukungan PFE berusaha untuk mencari tahu masalah ini.
Alasan terakhir adalah kredensial pengguna (untuk menjalankan langkah pekerjaan) tidak dapat mengakses statistik tabel yang mendasari (pada sisi server yang ditautkan), dan dengan demikian rencana eksekusi tidak dioptimalkan.
Secara detail, pengguna tidak memiliki izin pada DBCC SHOW_STATISTICS (meskipun pengguna dapat SELECT dari tabel). Menurut MSDN , aturan izin ini diubah setelah sql 2012 SP1
Semoga pengalaman ini dapat membantu komunitas.
sumber