SQL Server’da session ve request takibi, performans iyileştirme süreçlerinin bel kemiğidir. SQL Server mimarisinde her istemci bağlantısı, veritabanı motoru tarafından benzersiz bir şekilde tanımlanır. Bu makalede, bir bağlantının kurulduğu andan itibaren arka planda nasıl bir Session (oturum) oluşturulduğunu ve bu oturumların gerçekleştirdiği Request (istek) süreçlerini Dynamic Management Views (DMV) üzerinden nasıl analiz edebileceğimizi inceleyeceğiz.
SQL Server’a başarılı bir bağlantı gerçekleştirildiğinde, sistem bu bağlantıyı takip edebilmek için ona özel bir kimlik atar. Bu kimliğe Session ID veya daha yaygın adıyla SPID (Session Process ID) diyoruz. Mevcut çalıştığınız sorgu ekranının hangi oturum kimliğine sahip olduğunu öğrenmek için SELECT @@SPID komutunu kullanabilir veya SQL Server Management Studio (SSMS) üzerindeki sorgu sekmesinin başlığına bakabilirsiniz.

Sql Server’da connection yapıldıktan sonra unique olarak kendine özel bir session alır.
select session_id from sys.dm_exec_connections

Bir oturumun fiziksel bağlantı özelliklerini incelemek için sys.dm_exec_connections görünümü kullanılır. Bu görünüm bize bağlantının nereden geldiğini, hangi protokolü kullandığını ve ağ seviyesindeki yükünü gösterir.
Aşağıdaki sorgu ile bağlantı zamanı, IP adresi ve yapılan fiziksel okuma/yazma (I/O) miktarı gibi kritik verilere ulaşabiliriz:
SELECT session_id, connect_time, net_transport, auth_scheme, client_net_address,
num_reads, num_writes, last_read, last_write
FROM sys.dm_exec_connections;

Fiziksel bağlantının ötesinde, oturumun mantıksal durumunu (aktif, uyuyor vb.) ve hangi kullanıcı/program üzerinden geldiğini sys.dm_exec_sessions üzerinden takip ederiz. Analizlerimizde daha geniş bir perspektif kazanmak için bu iki tabloyu (Connections ve Sessions) session_id üzerinden joinleyerek tek bir rapor oluşturabiliriz. Connection alan bu sessionId’leri ortak bu dmv’leri joinleyerek bir ekranda sonuca ulaşabilirim.

- session_id: Session’ın Id’si
- connect_time: Connection’ın gerçekleştirildiği tarih
- net_transport: SQL Server’a gerçekleştirilen bağlantı türü
- auth_scheme: Gerçekleştirilen bağlantının tipi
- client_net_address: Bağlantı gerçekleştiren Session’ın IP bilgisi
- num_reads: Session’ın yapmış olduğu okuma sayısı
- num_writes: Yapmış olduğu yazma sayısı
- last_read: Yapılan son okumanın tarihi
- last_write: Yapılan son yazmanın tarihi
Bağlantı kurulduktan sonra session içerisinde çalıştırılan her komut bir Request oluşturur. SQL Server performans sorunlarını (CPU dar boğazı, kilitlenmeler) teşhis etmek için sys.dm_exec_requests en önemli aracımızdır.
Hangi session’ın ne kadar süredir çalıştığını ve tam olarak hangi SQL metnini yürüttüğünü bulmak için sys.dm_exec_sql_text fonksiyonunu kullanırız:
SELECT session_id, start_time, status, command, total_elapsed_time, text
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE status = 'running'
ORDER BY total_elapsed_time DESC;

Eğer bir sorgu yavaşsa, mutlaka bir şeyi bekliyordur (kilit, disk, network). blocking_session_id kolonu, bizi engelleyen asıl session’ı işaret eder.
SELECT session_id, wait_type, wait_time, blocking_session_id, text
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE wait_type IS NOT NULL
ORDER BY wait_time DESC;
Sorguların ne kadar CPU harcadığını veya hangi execution plan (sorgu planı) ile çalıştığını aşağıdaki yapılarla analiz edebiliriz:
-- Kaynak Tüketimi
SELECT session_id, command, cpu_time, reads, writes, logical_reads, text
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
ORDER BY cpu_time DESC;
-- Query Plan Analizi
SELECT r.session_id, r.status, r.command, q.query_plan
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) q;
SQL Server üzerinde session ve request yönetimi, veritabanı yöneticileri (DBA) için görünmezliği ortadan kaldıran bir penceredir. sys.dm_exec_connections ile kapıdan kimin girdiğini, sys.dm_exec_sessions ile kim olduğunu ve sys.dm_exec_requests ile içeride ne iş yaptığını anlık olarak izleyebiliriz. Performans sorunlarını çözmek için bu DMV’leri düzenli olarak izlemek, sistemin sağlığını korumanın en etkili yoludur.
Başka makalede görüşmek dileğiyle..
Başkaları ile alay etmeyin. Hucurat-11
