MSSQL Server’da Bloklama Sorunlarını Tespit Etmek: İpuçları ve Bir SQL Sorgusu Örneği

Share

MSSQL Server’da bloklama sorunları, birçok nedenle ortaya çıkabilir. Bu sorunlar, performans sorunlarına ve hatta veri kaybına neden olabilir. Bu nedenle, bloklama sorunlarını tespit etmek ve çözmek, bir veritabanı yöneticisi için önemlidir. Bu makalede, MSSQL Server’da bloklama sorunlarını tespit etmek için bazı ipuçlarına ve bir SQL sorgusu örneğine yer verilmiştir.

  1. Activity Monitor’u Kullanın

SQL Server Management Studio’daki Activity Monitor, sunucudaki bloklama sorunlarını tespit etmek için kullanılabilir. Activity Monitor’u açmak için SSMS’deki Object Explorer penceresinde sunucuya sağ tıklayın ve “Activity Monitor” seçeneğini seçin. Ardından “Processes” sekmesine geçin ve “Blocked By” sütununa bakarak hangi işlemlerin bloklanmış olduğunu görebilirsiniz.

  1. sp_who2 Stored Procedure’ünü Kullanın

sp_who2, sunucudaki mevcut bağlantıları ve işlemleri görüntüler. Bu stored procedure’u çalıştırarak hangi işlemlerin bloklama sorunlarına neden olabileceğini tespit edebilirsiniz. Ayrıca, “BlkBy” sütununda bloklama kaynağı olarak kimin belirtildiğine de bakabilirsiniz.

  1. DMV’leri (Dynamic Management Views) Kullanın

SQL Server’da birçok DMV bulunmaktadır. Bu DMV’ler, sunucudaki bloklama sorunlarını tespit etmek için kullanılabilir. Örneğin, sys.dm_tran_locks DMV’si, bloklama sorunlarını tespit etmek için kullanılabilir. Bu DMV’yi kullanarak, hangi işlemlerin hangi kaynakları bloke ettiğini görebilirsiniz.

  1. SQL Server Profiler’ı Kullanın

SQL Server Profiler, sunucudaki sorguları izlemenizi ve analiz etmenizi sağlar. Bloklama sorunlarını tespit etmek için, SQL Server Profiler’ı kullanarak, hangi sorguların hangi kaynakları bloke ettiğini görebilirsiniz.

Yukarıdaki yöntemlerden herhangi biri kullanılarak bloklama sorunları tespit edilebilir ve çözümlenebilir.

Aşağıdaki sorguyu kullanarak bloklama sorunu olabilecek isteklerin ve oturumların bir listesini alabilirsiniz.

SELECT
L.request_session_id AS SPID,
DB_NAME(L.resource_database_id) AS DatabaseName,
O.Name AS LockedObjectName,
P.object_id AS LockedObjectId,
L.resource_type AS LockedResource,
L.request_mode AS LockType,
ST.text AS SqlStatementText,
ES.login_name AS LoginName,
ES.host_name AS HostName,
TST.is_user_transaction as IsUserTransaction,
AT.name as TransactionName,
CN.auth_scheme as AuthenticationMethod
FROM
sys.dm_tran_locks L
JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id
JOIN sys.objects O ON O.object_id = P.object_id
JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id
JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id
JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id
JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id
CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST
WHERE
resource_database_id = db_id()
AND L.request_session_id != @@SPID
ORDER BY
L.request_session_id;

Aşağıdaki sorgu, bloklama zincirindeki tüm işlemleri gösterir:

SELECT
    spid
    ,sp.STATUS
    ,loginame   = SUBSTRING(loginame, 1, 12)
    ,hostname   = SUBSTRING(hostname, 1, 12)
    ,blk        = CONVERT(CHAR(3), blocked)
    ,open_tran
    ,dbname     = SUBSTRING(DB_NAME(sp.dbid),1,10)
    ,cmd
    ,waittype
    ,waittime
    ,last_batch
    ,SQLStatement       =
        SUBSTRING
        (
            qt.text,
            er.statement_start_offset/2,
            (CASE WHEN er.statement_end_offset = -1
                THEN LEN(CONVERT(nvarchar(MAX), qt.text)) * 2
                ELSE er.statement_end_offset
                END - er.statement_start_offset)/2
        )
FROM master.dbo.sysprocesses sp
LEFT JOIN sys.dm_exec_requests er
    ON er.session_id = sp.spid
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt
WHERE spid IN (SELECT blocked FROM master.dbo.sysprocesses)
AND blocked = 0

 

Bu T-SQL sorgusu SQL Server üzerinde çalıştırıldığında, bloklanmış işlemleri (blocked) ve onları bloke eden işlemleri (blocking) listeler. İlgili işlemlerin kimlik numaraları (spid), durumları (status), kullanıcı adları (loginame), bilgisayar isimleri (hostname), bloklama durumları (blocked), açık işlem sayıları (open_tran), veritabanı adları (dbname), işlem komutları (cmd), bekleme türleri (waittype), bekleme süreleri (waittime), son işlem tarihleri (last_batch) ve SQL ifadeleri (SQLStatement) gibi bilgileri listeler.

Bu sorgu, bloklama sorunlarını tespit etmek ve çözmek için kullanılabilir. Bloklama, bir işlemin diğer işlemleri bekletmesi ve sistemin performansını etkilemesi durumudur. Bu sorgu, bloklama sorunlarını tespit etmek için sık kullanılan bir araçtır ve bloklama sorunlarını çözmek için gereken adımları belirlemeye yardımcı olabilir.

SELECT sqltext. TEXT,req .total_elapsed_time,
req.session_id ,
req.start_time ,
req.status ,
req.wait_type ,
req.cpu_time ,
req.blocking_session_id ,
ses.*
--,req.*
FROM sys .dm_exec_sessions ses ,sys. dm_exec_requests req
CROSS APPLY sys. dm_exec_sql_text(sql_handle ) AS sqltext
where ses. session_id = req .session_id
--where req.total_elapsed_time > 5000
order by req.total_elapsed_time desc

SQL Server bloklama sorunları, birden fazla işlem (transaction) veya sorgunun aynı kaynaklara (örneğin, tablolar, satırlar, sayfalar, vb.) aynı anda erişmeye çalıştığı durumlarda ortaya çıkar. Bu kaynakların kilitleme mekanizmaları ile korunması nedeniyle, bu işlemler veya sorgular birbirleriyle çakışabilir veya kilitlenebilirler.

 

Bloklama sorunları genellikle aşağıdaki nedenlerden kaynaklanır:

  • Uzun Süren İşlemler
  • Yetersiz İndeksler
  • Veri Blokları
  • Yanlış Sıralama
  • Yetersiz Bellek
  1. Uzun süren işlemler: Uzun süren işlemler, özellikle büyük veri kümeleri üzerinde yapılan işlemler, diğer işlemler veya sorguların bekleme sürelerini artırabilir.
  2. Yetersiz indeksler: Yetersiz veya yanlış yapılandırılmış indeksler, birçok sorgunun aynı veri kaynaklarına erişmeye çalışması durumunda performans sorunlarına neden olabilir.
  3. Veri blokları: Veri blokları, benzer kaynaklara erişmeye çalışan işlemler arasında rekabet yaratabilir ve bu durum diğer işlemlerin bekleme sürelerini artırabilir.
  4. Yanlış sıralama: Birden fazla işlem veya sorgu, aynı kaynaklara aynı sırada erişmeye çalıştığında, bloklama sorunları ortaya çıkabilir.
  5. Yetersiz bellek: SQL Server, yetersiz bellek kullanımı durumunda diğer işlemlerle uygun şekilde rekabet edemeyebilir ve bu durum performans sorunlarına neden olabilir.

Bu nedenlerin yanı sıra, bloklama sorunları, uygulama kodunda yapılan hatalardan da kaynaklanabilir. Bu nedenle, uygulama geliştiricilerinin, uygun sorgu ve işlem yığını kullanımını sağlayarak bloklama sorunlarını en aza indirmesi önemlidir.

(Visited 207 times, 1 visits today)