SQL Server Pilih Hitung READ_COMMITTED_SNAPSHOT PERTANYAAN

8

Sepertinya saya mendapatkan banyak kebuntuan ketika melakukan pilih count (*) pada tabel tertentu. Saya telah mengubah semua parameter yang diperlukan dan membuatnya menjadi penguncian baris saja.

Saya juga mengubah basis data untuk menggunakan isolasi READ_COMMITTED_SNAPSHOT,

Namun, tampaknya menggunakan penghitungan pilih (*) di mana kolom =? di atas meja memicu kebuntuan atau kunci di atas meja ..

Apakah saya benar bahwa penghitungan pilih (*) seharusnya hanya mengakses baris perantara ?, Namun, sepertinya tidak seperti itu dan saya masih mengalami kebuntuan. Pengindeksan yang tepat mungkin akan membantu,

Pertanyaannya adalah: Apakah SQL server 2008 R2 menempatkan kunci bersama di atas meja selama jumlah pilih (*) bahkan ketika read_committed_snapshot diatur ke aktif?

Terima kasih

grassbl8d
sumber
Apakah Anda memerlukan penghitungan yang tepat (sesuai permintaan), atau apakah perkiraan perkiraan oke?
Jon Seigel
sebenarnya, saya hanya perlu tahu apakah kunci bersama ditempatkan. Saya mencoba untuk menyelidiki masalah kebuntuan. Terima kasih
grassbl8d
Maksud saya adalah bahwa jika Anda dapat mempertimbangkan untuk mengubah cara penghitungan diperoleh, itu mungkin cara untuk memecahkan masalah kebuntuan. Tetapi sekarang saya membaca pertanyaan itu lagi, jika Anda perlu menggunakan WHEREklausa, metode yang saya pikirkan tidak akan berhasil.
Jon Seigel
Anda bisa mengambil perkiraan jumlah dari tabel metadata untuk subset tabel jika klausa mana cocok dengan indeks yang difilter.
Aaron Bertrand

Jawaban:

2

Hati-hati dengan READ_COMMITTED_SNAPSHOT: jika Anda menyalakannya, itu dapat menyebabkan banyak bug halus.

READ_COMMITTED_SNAPSHOT juga adalah tingkat isolasi default, yang mungkin ditimpa oleh sesuatu. Jalankan DBCC USEROPTIONS untuk menentukan tingkat isolasi aktual yang Anda pilih berjalan di bawah.

Saya akan secara eksplisit SET TRANSAKSI ISOLASI LEVEL SNAPSHOT tepat sebelum Anda pilih. Dengan begitu Anda akan yakin bahwa orang yang Anda pilih tidak pernah menerima kebuntuan, dan Anda tidak merusak kode lain, seperti yang mungkin READ_COMMITTED_SNAPSHOT.

AK
sumber
0

Penguncian dengan Isolasi Snapshot tidak berubah. Apa yang berubah adalah ketika halaman diubah di bawah Anda, halaman-halaman tersebut disalin ke database tempdb sehingga Anda dapat membacanya dari database tempdb alih-alih dari database normal. (Ya ini adalah versi sederhana dari apa yang terjadi.)

Anda menyebutkan bahwa Anda tidak memiliki pengindeksan yang tepat, jadi Anda melakukan pemindaian indeks berkerumun (atau pemindaian tabel jika tumpukan). Itu berpotensi banyak data untuk dipindahkan ke database tempdb. Jika kueri ini adalah sesuatu yang akan dijalankan lebih dari sekali saya sarankan menambahkan indeks ke tabel.

Tingkat isolasi apa yang digunakan kueri Anda?

mrdenny
sumber
Saya menggunakan tingkat isolasi read_commited_snapshot. Saya menyalakannya karena saya menggunakan read_committed secara default. Saya hanya tertarik jika kunci ditempatkan selama penghitungan pilih. Terima kasih, saya sudah menempatkan indeks btw
grassbl8d
Ya kunci masih diambil. Anda dapat meminta sys.dm_tran_locks untuk melihat kunci yang diambil. Jalankan kueri Anda di satu jendela dan kueri sys.dm_tran_locks di jendela lain untuk melihat kunci apa yang diambil. Anda mungkin meningkat ke kunci tabel dan perlu menggunakan petunjuk untuk memaksa halaman atau bahkan kunci level baris.
mrdenny