Jadi saya telah menentukan bahwa perilaku tidak menentu dari SQL Server saya adalah karena pengaturan default SET ARITHABORT OFF
. Net SqlClient Data Provider . Dengan demikian, saya telah membaca berbagai artikel yang memperdebatkan cara terbaik untuk mengimplementasikannya. Bagi saya, saya hanya ingin cara yang mudah karena SQL Server menderita dan penyetelan kueri saya belum sepenuhnya transenden di seluruh aplikasi (dan jelas menambahkan SET
dalam sp A TIDAK BEKERJA).
Dalam artikel brilian Erland Sommarskog tentang topik tersebut, ia pada dasarnya menyarankan untuk mengambil pendekatan yang aman dengan mengubah aplikasi untuk mengeluarkan SET ARITHABORT ON
untuk koneksi. Namun, dalam jawaban ini dari pertanyaan dba.stackexchange , Solomon Rutzky menawarkan pendekatan instans luas dan di seluruh basis data.
Konsekuensi apa yang saya lewatkan di sini dengan mengatur seluruh instance ini? Seperti yang saya lihat ... karena SSMS telah menetapkan ini ON
secara default, saya tidak melihat ada salahnya mengatur seluruh ON
server ini untuk semua koneksi. Pada akhirnya, saya hanya perlu SQL Server ini untuk melakukan di atas segalanya.
sumber
ARITHABORT OFF
, maka baiklah. Matikan untuk semua koneksi yang masuk. (Semoga berhasil mengendalikan itu). Tetapi ketika koneksi datang dengan itu diatur ke ON, maka SQL menghasilkan rencana Query baru dan ini dapat mempengaruhi kinerja. Ambillah, setel ON sebagai opsi pengguna default di tingkat instance dan sesuaikan kueri.Jawaban:
Ada beberapa default yang ada hanya karena tidak ada yang benar-benar tahu apa efek mengubahnya. Misalnya, susunan level instance default ketika menginstal pada sistem yang menggunakan "Bahasa Inggris AS" sebagai bahasa OS
SQL_Latin1_General_CP1_CI_AS
. Ini tidak masuk akal karenaSQL_*
pemeriksaan untuk kompatibilitas pra-SQL Server 2000. Mulai di SQL Server 2000 Anda benar-benar dapat memilih Windows collation, dan default untuk sistem bahasa Inggris AS seharusnya diubah menjadiLatin1_General_CI_AS
. TETAPI, saya kira tidak ada seorang pun di Microsoft yang benar-benar tahu apa dampaknya bagi semua sub-sistem potensial dan prosedur tersimpan sistem, dll.Jadi, saya tidak mengetahui adanya dampak negatif spesifik dari pengaturan ke ON baik sebagai default database atau bahkan instance-wide. Pada saat yang sama, saya belum mengujinya. Tetapi bahkan jika saya telah mengujinya, saya mungkin masih tidak menggunakan jalur kode yang sama dengan aplikasi Anda, jadi ini adalah sesuatu yang benar-benar perlu Anda uji di lingkungan Anda. Setel ke
ON
pada tingkat contoh di lingkungan Dev dan QA Anda dan lihat cara kerjanya selama satu atau dua bulan. Kemudian aktifkan di Staging / UAT. Jika semua terus berjalan dengan baik selama beberapa minggu, gulung perubahan konfigurasi itu ke Produksi. Kuncinya adalah memberi waktu sebanyak mungkin untuk menguji berbagai jalur kode yang tidak mengenai setiap hari. Beberapa hit mingguan atau bulan atau tahunan. Beberapa jalur kode hanya dihantam oleh dukungan, atau beberapa laporan ad hoc atau pemeliharaan yang dibuat seseorang bertahun-tahun yang lalu dan tidak pernah memberi tahu Anda tentang dan hanya digunakan secara berkala (nah, itu tidak pernah terjadi ;-).Jadi, saya melakukan beberapa pengujian pada contoh yang masih memiliki pengaturan "opsi pengguna" default karena saya tidak pernah mengubahnya.
Tolong dicatat:
@@OPTIONS
/'user options'
adalah nilai bitmaskedARITHABORT ON
MEMPERSIAPKAN
Saya diuji dengan SQLCMD (yang menggunakan ODBC) dan LINQPad (yang menggunakan .NET SqlClient):
(
^
ini adalah karakter kelanjutan garis DOS;.
baris terakhir hanya untuk memaksa garis tambahan agar lebih mudah untuk menyalin dan menempel)Di LINQPad:
UJI 1: Sebelumnya
SQLCMD kembali:
LINQPad kembali:
MENGUBAH OPSI KONEKSI DEFAULT:
T-SQL berikut ini memungkinkan
ARITHABORT
tanpa menghapus opsi lain yang mungkin diatur, dan tanpa mengubah apa pun jikaARITHABORT
sudah ditetapkan dalam nilai bitmasked.UJI 2: Setelah
SQLCMD kembali:
LINQPad kembali:
Kesimpulan
Mengingat bahwa:
ARITHABORT OFF
ARITHABORT ON
OFF
ARITHABORT
, sehingga mereka menerima pengaturan defaultSaya akan menyarankan mengubah opsi koneksi standar instans-lebar (seperti yang ditunjukkan di atas). Ini akan kurang menonjol daripada memperbarui aplikasi. Saya hanya akan memperbarui aplikasi jika Anda menemukan masalah dengan mengubah pengaturan lebar-instance.
PS Saya melakukan tes sederhana dengan mengubah
tempdb
dan tidak mengubah pengaturan lebar-instance dan sepertinya tidak berhasil.sumber
SET ARITHABORT OFF
ini tidak hadir. Jadi mengapa khawatir hal itu hadir? satu-satunya contoh kita telah melihat di mana default ditimpa adalah pengaturan SSMS keON
(yang merupakan hal yang baik). Either way, saya telah memperbarui jawaban saya dengan pengujian dan apa yang saya lihat sebagai rekomendasi paling logis (per info yang ada).ARITHABORT OFF
jika Anda menemukan insiden aktualnya. Sejauh ini kemungkinan tidak ada. 3) Karena ini mempengaruhi rencana kueri, bisa jadi tabel tidak pernah memiliki cukup data untuk menyebabkan SQL Server untuk memiliki pilihan tertentu untuk dipertimbangkan, di mana sekarang ada lebih banyak pilihan, dan beberapa buruk. Atau mungkin ada faktor sementara lainnya, seperti statistik yang ketinggalan zaman, dll. Tidak sepenuhnya yakin.