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

70

Saya telah membaca di sini bahwa beberapa data tambahan akan disimpan per baris sehingga kita mungkin melihat penurunan kinerja tetapi risiko apa 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 lain masih bisa membaca data lama. Apakah ini benar?

Saya melihat ini karena saya muak dengan masalah penguncian dalam 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.

Adam Butler
sumber

Jawaban:

48

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

Beban

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

Keamanan

Yang paling penting, isolasi snapshot tidak aman dalam banyak kasus secara default . Baca "isolasi Snapshot" (Wikipedia) untuk lebih lanjut tentang anomali write-skew. 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:

gbn
sumber
35

Saya tahu ini adalah utas lama tapi saya akan mengatakan isolasi snapshot tingkat besar adalah peluru ajaib. Ini akan menghilangkan semua pemblokiran Anda antara pembaca dan penulis. Namun itu tidak akan 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 kerjakan selama hampir 20 tahun mengalami masalah pemblokiran yang jauh lebih sedikit daripada SQL Server. Sebagian besar pengembang SQL ragu untuk menggunakan isolasi snapshot karena mereka hanya menguji kode mereka terhadap database yang menggunakan pengaturan default.

Membuang
sumber
26

Beberapa poin tambahan untuk ditambahkan ke jawaban lain:

SET ALLOW_SNAPSHOT_ISOLATION ONhanya mengaktifkan isolasi snapshot dalam database. Untuk memanfaatkannya, Anda harus melakukan pengodean ulang dan SET TRANSACTION ISOLATION LEVEL SNAPSHOTuntuk transaksi yang Anda inginkan berlaku. Kode panggilan perlu diubah untuk menangani kesalahan perbaruan konflik.

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

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

Mark Storey-Smith
sumber
19

Saya percaya ini akan memberi kita sesuatu yang lebih dekat ke oracle di mana jika satu transaksi memperbarui transaksi lain masih bisa 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, IMO manfaatnya jauh lebih besar daripada kesulitan yang ditambahkan (berbicara dari perspektif Oracle) - dan tentu saja beberapa masalah penguncian secara sah hilang, itu adalah poin dari MVCC (ada juga kelas dari mengunci masalah yang tidak akan hilang karena masalah kode, tapi saya berasumsi Anda mengerti ini).

Jack Douglas
sumber
9

Kami menggunakan ISOLASI SNAPSHOT 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 terkait ISOLASI SNAPSHOT.

Situasi di mana beberapa utas yang 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 tersebut.

Alexander Nemsadze
sumber
-2

kami memilikinya aktif dan pernyataan sql pilih aneh menjalankan 4 pernah diblokir seluruh db tidak peduli berapa banyak core dan semua. Pengaturan RCSI off tetap itu. Saya akan menyalakannya sekali Anda menghadapi kebuntuan lainnya, bukan secara default.

Krautmaster
sumber