Saya memiliki tiga tabel Clustered Columnstore Index (CCI) di SQL Server 2016. Semua CCI ini berada dalam skema partisi yang sama, berdasarkan pada Tenant ID. Akhir-akhir ini, dan tidak konsisten, saya mendapatkan kebuntuan pada pernyataan pilih sederhana dari bergabung ke tabel ini. Contoh permintaan yang deadlock:
SELECT TOP 33 r.tenantid
FROM Table_r r
INNER JOIN Table_cm cm ON r.MyKey=cm.MyKey
INNER JOIN Table_pe pe ON r.MyKey=pe.MyKey
WHERE r.TenantId = 69
AND pe.TenantId = 69
AND cm.TenantId = 69
Pesan eror:
Transaksi (ID Proses 56) menemui jalan buntu pada sumber daya objek yang dapat ditunggu secara umum dengan proses lain dan telah dipilih sebagai korban kebuntuan. Jalankan kembali transaksi.
Petunjuk:
- Jika kueri menggunakan indeks lain selain CCI itu tidak menemui jalan buntu.
- Jika saya menghapus dua dari tiga filter tenantid, itu tidak menemui jalan buntu.
- Jika saya memilih 32 teratas atau lebih rendah itu tidak menemui jalan buntu.
- Jika saya menambahkan OPSI (MAXDOP 1) itu tidak menemui jalan buntu.
- Saya dapat merepro ini di replika PROD orak, PROD READ-ONLY Secondary, dan PROD sendiri.
- Saya tidak bisa mengulangi perilaku ini dalam DEV atau INT.
- Itu masih kebuntuan jika saya menambahkan DENGAN (NOLOCK) ke semua 3 tabel bergabung
- Kebuntuan itu sendiri. Ini akan menemui jalan buntu ketika tidak ada proses aktif lainnya.
- Rencana permintaan tanpa paralelisme tidak menemui jalan buntu
Versi PROD kami:
Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) 10 Jan 2019 18:51:38 Hak cipta (c) Microsoft Corporation Enterprise Edition (64-bit) pada Windows Server 2012 R2 Standar 6.3 (Build 9600) :) (Hypervisor)
Bagaimana cara mencegah kebuntuan pada kueri ini?
sumber