Saya agak penasaran, salah satu edisi SQL 2012 perusahaan dengan 128 GB ukuran RAM basis data adalah 370 GB dan terus bertambah, jumlah memori yang digunakan oleh kunci (OBJECTSTORE_LOCK_Manager) petugas memori menampilkan 7466016 KB. Saya juga bisa mengkonfirmasi dengan melihat counter perfselect * from sys.dm_os_performance_counters where counter_name = 'Lock Memory (KB)'
Namun, saat saya menjalankan kueri
select count(*) from sys.dm_tran_locks
ini hanya menampilkan 16 kunci. Jadi apa yang menggunakan kunci lebih dari 7 GB. Apakah ada cara untuk mengetahuinya?
Apakah itu berarti jika begitu memori untuk kunci telah dialokasikan, SQL belum membatalkan alokasi itu? Dalam 1 jam terakhir saya tidak melihat jumlah kunci melebihi 500 tetapi memori kunci tetap sama.
Max Server Memory adalah 106 GB, Kami tidak menggunakan halaman kunci dalam memori dan saya tidak melihat tekanan memori atau kesalahan dalam log kesalahan dalam 12 jam terakhir. Penghitung MBytes yang tersedia menunjukkan lebih dari 15 GB memori yang tersedia.
Monitor aktivitas secara konsisten menunjukkan 0 tugas tunggu sehingga jelas tidak ada pemblokiran.
Mengingat kunci server SQL membutuhkan sekitar 100 byte memori, 7 GB adalah banyak memori dan mencoba mencari tahu siapa yang menggunakannya.
Saya menjalankan papan dasbor server melaporkan transaksi teratas dengan jumlah kunci mengatakan "saat ini tidak ada transaksi penguncian yang berjalan pada sistem. Namun, memori kunci masih menunjukkan seperti yang dinyatakan di atas. DB paling sibuk selama jam semalam.
sumber
Jawaban:
Manajer kunci adalah super-panas jalur kritis kode tersebut (mungkin yang paling hot kode jalur kritis) bahwa jika harus menunggu pada alokasi memori untuk masing-masing kinerja kunci akan tangki. Mungkin mengalokasikan blok memori besar dan mengelola sendiri. Saya tidak akan terkejut jika itu juga cadangan memori sehingga tidak kehabisan memori di beberapa jalur kode kritis.
sumber
Tambahan untuk jawaban @ RemusRusanu (tidak akan cocok dengan komentar) ...
Mengingat bahwa mesin basis data akan mengizinkan hingga 5.000 kunci per objek sebelum meningkatkan dan mempertimbangkan jawaban Remus mengenai sifat kritis manajer kunci, reservasi tinggi mulai terlihat masuk akal:
5000 (kunci) * 10 (tabel atau indeks) * 96 (byte per kunci) * 1000 (permintaan bersamaan) = 4.47GB
Saya akan berspekulasi reservasi berasal dari kombinasi RAM yang tersedia dan beban kerja saat ini tetapi belum melihatnya didokumentasikan atau di-blog di mana saja. Bisa juga berspekulasi bahwa memori 128GB Anda akan dianggap murah hati pada tahun 2008 dan reservasi 7GB menandakan mengharapkan beban kerja OLTP yang berat pada ukuran itu.
sumber
sys.dm_tran_lock menunjukkan sumber daya yang dikunci dan permintaan untuk kunci pada sumber daya , bukan baris individual, yang dikunci. Setiap sumber daya yang dikunci akan menampung banyak baris dan, mungkin, objek lain, terkunci.
sumber