Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlara uygulanır:✅ Warehouse in Microsoft Fabric
Warehouse'taki sorgularınızın çalışması olağandışı şekilde uzun sürüyorsa veya takılı kalmış gibi görünüyorsa, olası nedenlerden biri kilitlemedir. Bir oturum diğer sorguların devam etmesini engelleyen bir kilit tuttuğunda kilitleme gerçekleşir.
Bu makalede, kilitlemenin iş yükünüzü etkileyip etkilemediğini ve gerçekleştirebileceğiniz eylemleri nasıl belirleyebileceğiniz gösterilir.
Tip
Warehouse, tablo düzeyinde kilitleme kullanır. Herhangi bir DML işlemi, etkilenen satır sayısına bakılmaksızın tablonun tamamında bir kilit alır. Bu davranış, satır düzeyi ve sayfa düzeyi kilitleri destekleyen SQL Server farklıdır.
Prerequisites
- Etkin iş yüklerine sahip bir Ambar.
- Görüntüleyici çalışma alanı rolü üyeliği, bu makaledeki dinamik yönetim görünümlerini (DMV) sorgulamak için en düşük izindir.
- DMV'lerle ilgili sorun giderme hakkında daha fazla bilgi için bkz. DMV kullanarak bağlantıları, oturumları ve istekleri izleme.
1. Adım: Sorguların kilitlerde bekleyip beklemediğini denetleyin
İşe, şu anda kilitlerde bekleyen herhangi bir sorgu olup olmadığını kontrol ederek başlayın.
Aşağıdaki sorguyu çalıştırın:
SELECT
request_session_id,
resource_type,
resource_description,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE request_status = 'WAIT';
Sorgu satır döndürürse, bazı oturumlar diğer oturumlar tarafından tutulan kaynakları bekler. Her satır, şu anda verilmeyen bir kilit isteğini gösterir.
Tip
sys.dm_tran_locks görünümü, verilen kilitlere ilişkin çok sayıda satır döndürebilir.
request_status = 'WAIT' ile filtreleme, engellenmiş oturumlara odaklanır.
2. Adım: Engellenen sorguları tanımlama
Ardından, hangi sorguların engellendiğini ve hangi oturumun engellendiğini denetleyin.
SELECT
session_id,
status,
blocking_session_id,
wait_type,
total_elapsed_time,
open_transaction_count
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;
Bu sorgu şunu döndürür:
- Engellenen sorguyu (
session_id) çalıştıran oturum - Şu anda bunu engelleyen oturum (
blocking_session_id) - Ne kadar süredir bekliyor (
total_elapsed_timemilisaniye cinsinden) - Engelleme oturumunun açık bir işlemi olup olmadığı (
open_transaction_count)
Bir sorgu, blocking_session_id değerinin sıfır olmadığını ve open_transaction_count > 0 gösteriyorsa, kilidi tutan başka bir oturumu bekliyordur.
3. Adım: Engelleme oturumunu bulma
Hangi kaynağın kilitlendiğini anlamak için, engelleyen oturum tarafından şu anda tutulan kilitleri inceleyin. Aşağıdaki örnek sorguda, <blocking_session_id> yerine daha önce belirlediğiniz bir session_id koyun:
SELECT
request_session_id,
resource_type,
resource_associated_entity_id,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE
request_status = 'GRANT'
AND request_session_id = <blocking_session_id>;
Aşağıdakileri belirlemek için bu sorguyu kullanın:
- Engelleyen oturumun şu anda kilit bulundurduğu kaynaklar. Örneğin,
resource_type = OBJECT’nin bulunduğuresource_associated_entity_id’i tanımlamak içinsys.objectskullanabilirsiniz. - Kilit modu (örneğin, Münhasır (
X), Şema Değişikliği (Sch-M)) - Kilidin bir DDL işlemi veya istatistik güncelleştirmesi (
UPDSTATS) ile ilgili olup olmadığı
Note
İstatistiklerle ilgili kilitler (UPDSTATS kaynaklı olanlar gibi) sys.dm_tran_locks içinde de görünür. Schema-Modification (Sch-M) ve Özel (X) kilitler en yaygın engelleyicilerdir, ancak herhangi bir kilit türü çakışan bir isteği engelleyebilir (örneğin, Sch-S bloklar Sch-M).
4. Adım: Engelleyen işlem sahibini bulma
Çoğu durumda, oturumu sonlandırmak yerine engelleme işleminin sahibine COMMIT veya ROLLBACK bu işlemin çalışmasına sormayı tercih edebilirsiniz.
COMMIT veya ROLLBACK ile hata işleme için TRY ve CATCH yapılarını kullanmayı göz önünde bulundurun. Daha fazla bilgi için TRY...CATCH bölümüne bakın.
Engelleyen oturumla ilişkili sorguyu ve sahibini belirleyebilirsiniz. Aşağıdaki örnek sorguda, <blocking_session_id> yerine daha önce belirlediğiniz bir session_id kullanın:
SELECT
r.session_id,
s.login_name,
s.program_name,
r.status,
r.blocking_session_id,
r.command,
r.total_elapsed_time,
s.last_request_start_time,
s.last_request_end_time
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s
ON r.session_id = s.session_id
WHERE r.session_id = <blocking_session_id>;
-
login_nameengelleme oturumunun sahibidir. -
program_name, oturumu başlatan uygulamadır.DMS_userdeğer, Fabric portal sorgu düzenleyicisini gösterir. -
commandşu anda çalışmakta olan komut.
Ardından, uygunsa işlemi onaylaması veya geri alması için işlem sahibiyle iletişime geçebilirsiniz.
5. Adım: Engelleme oturumunun boşta olup olmadığını veya ilerlemediğini denetleyin
Bloke eden bir oturum etkin görünebilir, ancak gerçekte ilerleme kaydetmiyor olabilir.
Boşta veya durdurulmuş bir oturumun göstergeleri şunlardır:
-
status = 'sleeping'etkin sorgu çalıştırmadığını gösterir. - Geçerli zamandan önemli ölçüde daha eski olan ve uzun süredir açık kalan bir isteği gösteren bir
last_request_start_timearayın. - Denetimler arasında artmayan ve takılmış bir oturuma işaret eden bir
total_elapsed_timearayın.
SELECT
session_id,
status,
last_request_start_time,
last_request_end_time,
open_transaction_count
FROM sys.dm_exec_sessions
WHERE session_id = <blocking_session_id>;
- Oturum durumu
sleepingveopen_transaction_count > 0ise, oturumun aktif sorgusu olmayan açık bir işlemi vardır; herhangi bir iş yapmadan bir kilidi elinde tutar. - Oturum içinde
sys.dm_exec_requestsgörünürse vetotal_elapsed_timedenetimler arasında artmaya devam ederse oturum etkin bir şekilde ilerler. İşlemi sonlandırmak ve geri almayı zorlamak yerine işlemin tamamlanmasını beklemek tercih edilebilir.
6. Adım: Engellemeyi çözmek için eylem gerçekleştirme
Note
Engelleme durumları genellikle engelleme oturumu işlemi tamamladıktan sonra kendi kendine çözülür. İş yükünüz gecikmeyi tolere edebilirse en güvenli seçenek beklemektir.
Aşağı akış sorgularının engellemesini kaldırmanız gerekiyorsa, engelleme oturumunun aşağıdaki özelliklere sahip olup olmadığını göz önünde bulundurun:
- Açık bir işlem var
- Boşta görünüyor veya ilerlemiyor
- Engelleyici bir kilit tutuluyor mu (örneğin, Exclusive (
X) veyaSch-M)
Bu durumda, Yönetici çalışma alanı rolünün bir üyesi aşağıdakileri kullanarak oturumu sonlandırabilir:
KILL <session_id>;
Komut KILL şu şekilde olur:
- Oturumu sonlandırma
- O oturumun etkin işleminde yapılan tüm değişiklikleri geri al
- Kilidi serbest bırakma
- Aşağı akış sorgularının devam etmesine izin ver
Caution
Bir oturumun sonlandırılması, o oturum tarafından gerçekleştirilen tüm kaydedilmemiş işlemleri geri alır. Bu eylem, kullanıcı veya uygulama tarafından yapılan veri değişikliklerini geri alabilir. Bu seçeneği yalnızca işlemi sonlandırmanın iş yükünüzü olumsuz etkilemediğinden emin olduğunuzda kullanın.
7. Adım: Gelecekteki kilitleme sorunlarını önleme
Benzer sorunları önlemeye yardımcı olmak için:
- Açık işlemleri açık bırakmaktan kaçının (
BEGIN TRANSACTIONkarşılık gelenCOMMITveyaROLLBACKolmadan). - İşlemleri kısa süreli tutun. Yalnızca işlem içinde gerekli işlemleri gerçekleştirin.
- Tamamlandığında her zaman
COMMITveyaROLLBACKişlemler. - Düşük trafikli pencereler sırasında DDL işlemlerini (örneğin
ALTER TABLE) zamanlayın.
Aşağıdakini kullanarak açık işlemleri proaktif olarak izleyin:
SELECT
session_id,
login_name,
open_transaction_count,
program_name,
status,
blocking_session_id,
last_request_start_time
FROM sys.dm_exec_sessions
WHERE open_transaction_count > 0;
Açık işlemleri düzenli olarak izlemek ve uygun olduğunda araya girip zincirlerin oluşmasını engelleme olasılığını azaltmaya yardımcı olur.