Beberapa konteks:
Awalnya kami menulis laporan hanya "lurus ke atas", tanpa ada petunjuk penguncian dalam kueri. Dengan laporan yang lebih besar ini terkadang menyebabkan masalah penguncian. Pada awalnya kami memperbaikinya dengan menggunakan WITH (NOLOCK)
petunjuk untuk tabel dalam kueri.
Karena (a) cukup menonjol, dan (b) mudah untuk melupakan petunjuk untuk salah satu tabel, kami pindah ke pengaturan pendekatan kedua TRANSACTION ISOLATION LEVEL
ke READ UNCOMMITTED
(yang baik-baik saja) di bagian atas setiap permintaan dataset.
Seperti yang Anda duga, masih mudah untuk melupakan petunjuk untuk salah satu dataset. Jadi ini mengarah pada pertanyaan:
Pertanyaan: Apa saja opsi untuk mengirim NOLOCK
petunjuk bersama dengan permintaan laporan?
PS. Saya menyadari bahwa ini adalah masalah XY (dengan banyak pilihan saya yang lain untuk X, seperti mengoptimalkan kueri, tidak melakukan pelaporan pada basis data operasional, dll), tetapi mencoba untuk membuat ini menjadi pertanyaan yang valid pada dirinya sendiri tetap saja .
Opsi:
Berikut adalah opsi yang disebutkan di atas, dengan opsi tambahan yang saya ingin tahu jika mereka akan bekerja:
- Tetapkan
WITH (NOLOCK)
petunjuk untuk setiap tabel. (Obtrusif, sangat mudah dilupakan) - Setel tingkat isolasi ke
READ UNCOMMITTED
untuk seluruh permintaan. (masih mudah dilupakan) - Apakah mungkin untuk menentukan ini di tingkat laporan ? Misalnya, pastikan semua permintaan dataset untuk satu laporan akan dijalankan tanpa penguncian.
- Apakah mungkin untuk menentukan ini di tingkat SSR lainnya ? Misalnya mungkin mengatur ini untuk Folder Laporan tertentu, atau dengan menggunakan ekstensi?
- Apakah mungkin untuk menentukan ini pada level string sumber / koneksi data ? Misalnya, apakah semua laporan yang relevan menggunakan "No-lock-data-source" tertentu?
- Terkait dengan opsi sebelumnya: mungkin ada kemungkinan untuk menentukan petunjuk penguncian default untuk "no-lock-sql-user" tertentu (yang digunakan dalam koneksi)?
- ???
Opsi mana yang layak? Apakah ada opsi yang saya lewatkan?
sumber
Jawaban:
Jawaban cepat:
Ada beberapa opsi yang layak jika laporan dioptimalkan dan masih menyebabkan masalah:
sumber
Sudahkah Anda mempertimbangkan
READ_COMMITTED_SNAPSHOT
pembuatan versi baris untuk basis data?Kim Tripp memiliki artikel yang bagus tentang hal ini di http://msdn.microsoft.com/en-us/library/ms345124%28v=sql.90%29.aspx
READ_COMMITTED_SNAPSHOT
memungkinkan fungsionalitas yang lebih baik daripadaWITH (NOLOCK)
yang memberikan konsistensi titik-in-waktu absolut untuk agregasi yang berjalan lama atau permintaan dengan peningkatan throughput karena pertikaian kunci berkurang.sumber