Opsi untuk mengatur petunjuk NOLOCK dalam permintaan dataset

7

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 LEVELke 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 NOLOCKpetunjuk 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:

  1. Tetapkan WITH (NOLOCK)petunjuk untuk setiap tabel. (Obtrusif, sangat mudah dilupakan)
  2. Setel tingkat isolasi ke READ UNCOMMITTEDuntuk seluruh permintaan. (masih mudah dilupakan)
  3. Apakah mungkin untuk menentukan ini di tingkat laporan ? Misalnya, pastikan semua permintaan dataset untuk satu laporan akan dijalankan tanpa penguncian.
  4. Apakah mungkin untuk menentukan ini di tingkat SSR lainnya ? Misalnya mungkin mengatur ini untuk Folder Laporan tertentu, atau dengan menggunakan ekstensi?
  5. Apakah mungkin untuk menentukan ini pada level string sumber / koneksi data ? Misalnya, apakah semua laporan yang relevan menggunakan "No-lock-data-source" tertentu?
  6. Terkait dengan opsi sebelumnya: mungkin ada kemungkinan untuk menentukan petunjuk penguncian default untuk "no-lock-sql-user" tertentu (yang digunakan dalam koneksi)?
  7. ???

Opsi mana yang layak? Apakah ada opsi yang saya lewatkan?

Jeroen
sumber
Masalah dengan pergi ke nolocks di mana-mana, atau mengubah isolasi untuk membaca tanpa komitmen di seluruh papan adalah masalah kualitas data. Anda tidak hanya mendapatkan pembacaan yang kotor, tetapi Anda berpotensi dapat mengembalikan data yang sama dua kali atau melewatkan data sekaligus. Mungkin lebih baik untuk melihat desain Anda dan melihat apakah sudah waktunya untuk database pelaporan yang terpisah. Lihat pertanyaan
Mike Walsh
@MikeWalsh Setuju. Itulah yang saya coba sampaikan dalam sedikit tentang masalah XY. Namun, mengetahui di mana dan kapan itu merupakan opsi untuk menggunakan petunjuk penguncian mungkin bermanfaat, jika digunakan dengan hati-hati.
Jeroen

Jawaban:

5

Jawaban cepat:

  1. Berfungsi, seperti yang Anda catat.
  2. Berfungsi, seperti yang Anda catat.
  3. Tampaknya ini tidak berfungsi. Saya tidak melihat opsi begitu saja dan kapan pun pertanyaan itu ditanyakan, jawabannya selalu kembali ke pengaturan tingkat isolasi dalam prosedur tersimpan .
  4. Saya tidak akan percaya begitu. SSRS berada pada lapisan abstraksi yang lebih tinggi daripada mesin basis data, jadi dalam beberapa hal, itu tidak 'peduli' apa tingkat isolasi - setelah semua, Anda dapat menggunakan solusi non-RDBMS dalam laporan Anda.
  5. Ini tidak bekerja. Anda tidak dapat mengatur level isolasi dalam string koneksi .
  6. Ini bisa berhasil. Anda dapat membuat pemicu masuk .

Ada beberapa opsi yang layak jika laporan dioptimalkan dan masih menyebabkan masalah:

  1. Gunakan Selalu Aktif jika Anda memiliki SQL 2012. Anda kemudian dapat memiliki replika hanya-baca yang dapat digunakan laporan SSRS Anda.
  2. Gunakan replikasi: snapshot jika Anda tidak perlu waktu nyata, dan transaksional jika Anda perlu dekat dengan waktu nyata.
  3. Jika Anda tidak memiliki anggaran untuk Selalu Aktif atau kesabaran untuk menangani replikasi, lakukan replikasi dengan murah: buat skema ramah-laporan (mis., Denormalkan tabel dan taruh dalam format yang membuatnya lebih mudah untuk menjalankan laporan ) dan gunakan SSIS untuk memberi makan skema Laporan itu. Ini berfungsi lebih baik jika pengguna akhir Anda dapat hidup dengan data "lama" (mis., Memperbarui setiap jam atau setiap 5 menit). Kelemahannya adalah Anda akan mendesain model data dua kali: sekali untuk model OLTP dan sekali untuk model pseudo-warehousing. Keuntungannya adalah jika Anda pernah bergerak ke arah gudang data terpusat, ini adalah latihan yang sangat membantu.
Kevin Feasel
sumber
6

Sudahkah Anda mempertimbangkan READ_COMMITTED_SNAPSHOTpembuatan 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_SNAPSHOTmemungkinkan fungsionalitas yang lebih baik daripada WITH (NOLOCK)yang memberikan konsistensi titik-in-waktu absolut untuk agregasi yang berjalan lama atau permintaan dengan peningkatan throughput karena pertikaian kunci berkurang.

Max Vernon
sumber