Sesi yang diblokir menunggu dengan PAGELATCH_ * jenis tunggu?

9

Diedit: Mengapa sesi pelaporan diblokir tetapi menunggu dengan PAGELATCH_*, dan bukan LCK_M_jenis menunggu terkait?

Saya sebelumnya berasumsi bahwa SQL server hanya akan melaporkan sesi pemblokiran di kolom blocking_session_Id. Jika sesi diblokir sedang menunggu kunci logis dan bukan yang lain seperti a PAGELATCH_*.

masukkan deskripsi gambar di sini

Pixelated
sumber
Sepertinya banyak sesi bersamaan memasukkan data ke dalam tabel. Bisakah Anda memposting struktur tabel bersama dengan indeks?
Kin Shah
@Kin tabel mulai disisipkan oleh SPID 69, 82 dan 84 memang memiliki indeks berkerumun yang didefinisikan dengan properti IDENTITY (1,1) sehingga bisa menjadi kasus pertikaian penyisipan halaman terakhir tetapi pada tahap ini saya lebih tertarik pada mengapa sesi yang diblokir menunggu dengan jenis tunggu terkait yang tidak mengunci. Yang juga menarik, SPID 93 berusaha menempatkan XLOCK di atas meja yang sama sekali tidak terkait dengan tabel yang dipilih oleh 64.
Pixelated

Jawaban:

6

Saya sebelumnya berasumsi bahwa SQL Server hanya akan melaporkan sesi pemblokiran di kolom blocking_session_id, jika sesi diblokir sedang menunggu kunci logis dan bukan hal lain seperti a PAGELATCH_*.

Anda menggunakan sp_WhoIsActiveprosedur Adam Machanic , bukan fasilitas SQL Server bawaan. Prosedur Adam melaporkan semua penyebab pemblokiran yang 'menarik', bukan hanya pemblokiran kunci. Informasi yang mendasarinya berasal dari berbagai sumber, termasuk sysprocesses , sys.dm_exec_requests , dan sys.dm_os_waiting_tasks .

Suatu tugas dapat menunggu hal-hal lain selain kunci. Mungkin dapat, misalnya, untuk memperoleh kunci eksklusif pada baris pada halaman, tetapi kemudian masih harus menunggu untuk mendapatkan kait halaman eksklusif (karena tugas lain telah mengunci halaman yang sama dalam mode yang tidak kompatibel).

Dalam contoh Anda, PAGELATCH_EXkait halaman eksklusif ada pada data biasa atau halaman indeks, bukan halaman PFS, GAM, SGAM, DCM, atau BCM, seperti yang ditunjukkan oleh (*) di akhir wait_info .

Anda dapat menemukan dokumentasi (entri blog) untuk di sp_WhoIsActive sini .

Paul White 9
sumber