Perbedaan Antara Tingkat Baris dan Penguncian Tingkat Halaman dan Konsekuensi

10

Ketika mencoba menjalankan Rencana Pemeliharaan saya, saya menerima kesalahan berikut:

Menjalankan "" permintaan gagal dengan kesalahan berikut: "Indeks" "(partisi 1) pada tabel" "tidak dapat ditata ulang karena penguncian tingkat halaman dinonaktifkan."

Kami saat ini mengaktifkan penguncian Tingkat Baris pada Indeks ini. Saya dapat mengaktifkan penguncian Tingkat Halaman, tetapi saya tidak yakin apa akibatnya.

Pertanyaan saya adalah: Apa perbedaan antara dua skema penguncian, dan apa konsekuensi dunia nyata (dalam produksi)?

Bawang-Ksatria
sumber

Jawaban:

14

Menjalankan "" permintaan gagal dengan kesalahan berikut: "Indeks" "(partisi 1) pada tabel" "tidak dapat ditata ulang karena penguncian tingkat halaman dinonaktifkan."

Rencana pemeliharaan harus mencoba ALTER INDEX REORGANIZE, yang merupakan operasi online. Untuk menghapus fragmentasi (halaman tidak berurutan), halaman harus dikunci dan dipindahkan, yang tidak mungkin jika kunci halaman telah dinonaktifkan. Satu-satunya cara untuk defragment tanpa kunci halaman adalah dengan mengunci seluruh partisi, yang tidak mungkin untuk REORGANIZE sebagai hanya online.

Apa perbedaan antara dua skema penguncian, dan apa konsekuensi dunia nyata (dalam produksi)?

Anda perlu memahami apa catatan dan halaman untuk mengevaluasi dampak dari menolak jenis kunci tertentu. Jika Anda tidak terbiasa dengan penyimpanan internal SQL Server, mulailah dengan Anatomi Rekaman dan Anatomi Halaman . Sederhananya:

  • baris = catatan
  • baris disimpan di halaman 8kb

Jika Anda mengubah jenis kunci yang diizinkan:

  • Nonaktifkan kunci halaman = Hanya kunci baris dan tabel
  • Nonaktifkan kunci baris = Hanya kunci halaman dan tabel
  • Nonaktifkan keduanya = Kunci meja saja

Ada dua skenario yang saya ketahui di mana dapat bermanfaat untuk melarang jenis kunci. Tidak berarti tidak ada orang lain, semoga orang lain memberikan contoh.

Tabel pencarian yang sering diakses, yang jarang berubah - Dengan menonaktifkan kunci level halaman dan baris, semua pembaca akan mengambil kunci tabel bersama. Ini lebih cepat / lebih murah daripada maksud yang dibagi bersama di atas meja, diikuti dengan maksud yang dibagikan di halaman dan akhirnya kunci bersama di baris atau baris tertentu.

Mencegah skenario kebuntuan tertentu - Jika Anda menemukan kebuntuan yang disebabkan oleh proses bersamaan yang mendapatkan kunci yang sering ada di halaman yang sama, jika tidak diblokir, kunci baris akan menghasilkan kunci halaman yang diambil. Hanya satu proses yang kemudian dapat mengakses halaman sekaligus, yang lain harus menunggu.

Contoh pertama adalah optimasi mikro dan tidak mungkin untuk menghasilkan manfaat yang terukur pada sistem yang khas. Yang kedua akan menyelesaikan skenario jalan buntu tertentu tetapi dapat memperkenalkan efek samping yang tidak terduga misalnya membunuh konkurensi di bagian kode yang berbeda. Sulit menilai dampak sepenuhnya, pendekatan dengan hati-hati!

Defaultnya adalah keduanya diaktifkan dan ini tidak boleh diubah tanpa alasan yang baik.

Mark Storey-Smith
sumber
9

Mungkin tidak ada. Saya yakin MS tahu lebih baik dari Anda atau saya

Saya telah bekerja pada sistem OLTP volume tinggi dan tidak pernah merasa perlu mengubah pengaturan. Jalan buntu harus dicoba lagi karena hal itu akan terjadi

Mengutip dari blog SQL Server Storage Engine, "Kunci Eskalasi di SQL2005" dan yang layak dibaca sepenuhnya.

Secara default, kami memiliki kunci ROW dan PAGE yang diaktifkan ... SQL Server memilih granularity kunci ROW untuk sebagian besar kasus tetapi dapat memilih kunci PAGE yang sesuai. Jadi untuk case yang Anda tentukan, kemungkinan ROW lock. Tidak ada cara untuk mematikan penguncian HALAMAN pada basis data atau tingkat contoh. Apakah Anda mengalami pemblokiran karena kunci PAGE?

Saya rasa jika Anda memaksakan hanya rowlock maka Anda akan menggunakan sumber daya yang bisa digunakan secara lebih efektif di tempat lain. Jika beban Anda cukup tinggi sehingga penting, lalu mengapa menggunakan memori? Artikel blog membahas hal ini

Saya menduga ada beberapa takhayul di balik ini, seperti ini:

gbn
sumber
+1 tetapi: kebuntuan dalam sistem OLTP dapat dicegah; sistem saya berjalan bebas dari kebuntuan selama berbulan-bulan, meskipun kami menggunakan 2-3 kali seminggu.
AK