it-swarm.asia

Apa risiko yang ada jika kita mengaktifkan snapshot yang sudah dibaca dalam sql-server?

Saya telah membaca di sini bahwa beberapa data tambahan akan disimpan per baris sehingga kita mungkin melihat penurunan kinerja tetapi risiko apa lagi yang ada?

misalnya. Apakah ini akan memengaruhi pemulihan basis data? Apakah ada hal lain yang perlu kita lakukan untuk memanfaatkan ini?

Saya berencana untuk menjalankan perintah-perintah ini:

ALTER DATABASE DatabaseName SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE DatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON

Saya percaya ini akan memberi kita sesuatu yang lebih dekat ke Oracle di mana jika satu transaksi memperbarui transaksi lainnya masih dapat membaca data lama. Apakah ini benar?

Saya melihat ini karena saya muak dengan masalah penguncian di SQL Server 2005. Saya berharap ini dapat mengurangi kebuntuan sesekali yang dilihat pengguna kami, membantu keseluruhan kinerja aplikasi kami dan mendorong pengembang kami untuk melakukan lebih dari satu operasi per transaksi tanpa takut.

73
Adam Butler

Ringkasan

  1. Jika Anda memiliki masalah penguncian maka Anda memiliki masalah dengan kode Anda: itu bukan mesin basis data
  2. Itu bukan peluru ajaib
  3. Anda dapat menambahkan lebih banyak masalah

Muat

Ini juga akan menambah beban pada tempdb Anda dan CPU . Lihat juga:

Keselamatan

Paling penting, isolasi snapshot tidak aman dalam banyak kasus secara default. Baca "Isolasi foto" (Wikipedia) untuk informasi lebih lanjut tentang anomali tulis-miring. Bagian selanjutnya adalah "Membuat Isolasi Snapshot Serializable" untuk menyiasati ini.

Secara umum, oleh karena itu, isolasi snapshot menempatkan beberapa masalah dalam mempertahankan kendala non-sepele bagi pengguna, yang mungkin tidak menghargai potensi jebakan atau solusi yang mungkin. Kelebihan dari transfer ini adalah kinerja yang lebih baik.

Lihat juga:

49
gbn

Saya tahu ini adalah utas lama tapi saya akan mengatakan untuk isolasi snapshot derajat besar adalah peluru ajaib. Ini akan menghilangkan semua pemblokiran Anda antara pembaca dan penulis. Namun itu akan tidak mencegah penulis memblokir penulis lain. Tidak ada cara selain itu.

Dalam pengalaman saya, beban tambahan pada TEMPDB diabaikan dan manfaat dari versi baris dalam mengurangi pembaca yang diblokir sangat besar.

Sebagai referensi, pembuatan versi baris (isolasi snapshot) adalah metode yang telah digunakan Oracle selama beberapa dekade untuk mencapai isolasi tanpa memblokir pembaca dan Oracle DB yang telah saya garap selama hampir 20 tahun pengalaman jauh lebih sedikit masalah pemblokiran daripada SQL Server tidak. Sebagian besar pengembang SQL ragu-ragu untuk menggunakan isolasi snapshot karena mereka hanya menguji kode mereka terhadap database yang menggunakan pengaturan default.

36
Chuck

Beberapa poin tambahan untuk ditambahkan ke jawaban lain:

SET ALLOW_SNAPSHOT_ISOLATION ON hanya memungkinkan isolasi snapshot dalam database. Untuk memanfaatkannya, Anda harus melakukan pengodean ulang dan SET TRANSACTION ISOLATION LEVEL SNAPSHOT untuk transaksi yang Anda inginkan. Kode panggilan perlu diubah untuk menangani kesalahan konflik pembaruan.

Setelah SET READ_COMMITTED_SNAPSHOT ON, pernyataan di read commit menggunakan row-versioning. Catatan, ini adalah level pernyataan versi baris untuk hanya baca . Untuk pembaruan, baris "nyata" diambil dan perbarui kunci diterapkan. Lihat bagian Ringkasan Perilaku di Memahami Level Isolasi Berbasis Versi-Baris

Apa pun caranya, tanpa pengujian menyeluruh Anda kemungkinan akan memperkenalkan serangkaian masalah yang sama sekali baru ke sistem.

26

Saya percaya ini akan memberi kita sesuatu yang lebih dekat ke Oracle di mana jika satu transaksi memperbarui transaksi lainnya masih dapat membaca data lama. Apakah ini benar?

Ya, ini benar .

Layak membaca tautan dalam jawaban gbn dan saya percaya hal yang sama berlaku untuk MVCC default Oracle untuk SQL Server dalam mode Isolasi Snapshot. Saya akan menambahkan bahwa jika Anda memahami potensi jebakan, manfaat IMO jauh lebih besar daripada kesulitan yang ditambahkan (berbicara dari perspektif Oracle) - dan tentu saja beberapa masalah penguncian secara sah hilang, itu adalah titik MVCC (ada juga kelas mengunci masalah yang tidak akan hilang karena masalah kode, tapi saya berasumsi Anda mengerti ini).

Kami menggunakan SNAPSHOT ISOLATION di semua proyek kami yang menggunakan SQL Server DB. Tidak ada lagi Kesalahan 1205 SQL, yang disebabkan bukan karena kode aplikasi yang salah, tetapi dari penguncian halaman default dan perilaku penguncian baris.

Dampak kinerja minimal dan sejauh 7 tahun telah berlalu, ratusan juta operasi telah diproses dalam sistem yang berbeda, tanpa masalah mengenai ISOLASI SNAPSHOT.

Situasi di mana beberapa utas berbeda memperbarui informasi penting bisnis dalam satu baris secara paralel sangat luar biasa, dan kemungkinan bahwa ISOLASI SNAPSHOT akan menjadi penyebab masalah inkonsistensi sangat mendekati nol.

Jika Anda memiliki sistem OLTP, yang dengan desain memperbarui satu baris berdasarkan data baris saat ini di banyak utas, tentu saja SNAPSHOTS tidak dapat diterima dalam kasus seperti itu.

10