SQL Server 2016'da üç Kümelenmiş Sütun Dizini (CCI) tablosu var. Bu CCI'lerin tümü Kiracı Kimliğine göre aynı bölümleme şemasındadır. Son zamanlarda ve tutarsız bir şekilde, birleşimlerden bu tablolara kadar basit seçme ifadeler üzerinde kilitlenmeler alıyorum. Kilitlenmeyi engelleyen örnek sorgu:
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
Hata mesajı:
İşlem (İşlem Kimliği 56) jenerik bekleme nesnesi kaynakları üzerinde başka bir işlemle kilitlendi ve kilitlenme kurbanı olarak seçildi. İşlemi yeniden çalıştırın.
İpuçları:
- Sorgu CCI dışında başka bir dizin kullanırsa, kilitlenmez.
- Üç kiracı filtreden ikisini kaldırırsam kilitlenmez.
- En üst 32 veya altını SEÇERSEN kilitlenmez.
- SEÇENEK (MAXDOP 1) eklersem kilitlenmez.
- Bunu şifreli PROD kopyamda, PROD ONADE Sekonder ve PROD'un kendisinde çoğaltabilirim.
- DEV veya INT'de bu davranışı yeniden oluşturamıyorum.
- 3 tablo birleşimine WITH (NOLOCK) eklersem hala kilitlenme
- Sorgu kendini kilitler. Başka aktif süreç olmadığında kilitlenecektir.
- Paralelliksiz sorgu planları çıkmaz
PROD Sürümümüz:
Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) 10 Ocak 2019 18:51:38 Telif Hakkı (c) Windows Server 2012 R2 Standard 6.3 (Derleme 9600) üzerinde Microsoft Corporation Enterprise Edition (64 bit) :) (Hipervizör)
Bu sorgudaki kilitlenmeleri nasıl önleyebilirim?