Bu makalede MSSQL Server Execution State kavramlarını detaylı bir şekilde görmüş olacağız. SQL Server’da bir sorgunun (query) çalışma süreci boyunca farklı Execution State durumlarında bulunabilir. Bu durumlar, sorgunun işlenme sırasında SQL Server’ın ne yaptığını anlamak ve olası performans sorunlarını tespit etmek için kritik öneme sahiptir. Sp_whoIsactive çalıştırıldıktan sonra Status bölümünden aşağıdaki açıklayacağımız bölümleri görebiliriz.

- Runnable
Sorgu çalışmaya hazırdır ancak CPU kaynaklarına erişim sırasını bekliyordur. Sorgunun çalışması için gereken tüm kaynaklar (ör. bellek veya kilit) hazırdır. Ancak, CPU meşgul olduğu için sorgu bir işlemci döngüsü almayı bekliyordur. Bu durum genellikle CPU darboğazı olduğunda gözlemlenir. Bu durumda olan sorguları izlemek için sys.dm_exec_requests DMV’sini kullanabilir ve CPU kullanımını değerlendirmek için sys.dm_os_waiting_tasks sorgusundan yararlanabilirsiniz.
Aşağıdaki sorgu çalışmaya hazır CPU sırası bekleyen sorguları göstermektedir.
SELECT
r.session_id,
r.status,
r.command,
r.wait_type,
r.wait_time,
r.cpu_time,
r.logical_reads,
t.text AS sql_text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.status = 'runnable';
2. Running
Sorgu CPU tarafından işleniyor ve aktif olarak çalıştırılıyor.
Sorgu gerekli kaynakları (ör. bellek, kilit) aldıktan sonra işlemci üzerinde çalıştırılıyor. Bu, sorgunun en aktif durumudur. Bu durumda olan sorguların durumlarını görmek için Activity Monitor veya sys.dm_exec_requests DMV’sini kullanabilirsiniz.
Ayrıca, sorgu Query Execution Plan üzerinden analiz edilebilir.
Aşağıdaki sorgu anlık çalışan sorguları göstermektedir.
SELECT
s.session_id,
s.login_name,
s.status,
r.command,
r.cpu_time,
r.logical_reads,
r.reads,
r.writes,
t.text AS sql_text
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE s.status = 'running';

3. Suspended
SQL Server’da çok sayıda işlem “suspended” durumda bekliyorsa, bu genellikle kaynak bekleyen işlemler nedeniyle olur. Sorgu bir kaynak beklediği için çalışmayı geçici olarak durdurmuştur. Beklenen kaynaklar şunlar olabilir: IO işlemleri (ör. diskteki veriler),Bellek , Kilit (lock)
Bu durum genellikle sistemde darboğazların veya bekleme türlerinin (wait types) işareti olabilir.
Sorgular, diskteki veriye erişmek için uzun süre bekleyebilir. Özellikle *tempdb*, veri veya log dosyalarının yavaş olduğu durumlarda bu problem yaşanabilir. Bir işlem başka bir işlemin tamamlanmasını bekliyor olabilir. Bazı sorgular yüksek CPU tüketebilir ve kaynak beklemesine neden olabilir. Yetersiz bellek veya aşırı cache kullanımı sorguların beklemesine neden olabilir.
Deadlock: İki işlem birbirinin tamamlanmasını bekliyor olabilir.
En sık karşılaşılan Wait Types:
PAGEIOLATCH_: Diskten veri okuma bekleniyor.
LCK_M_: Kilit çözülmesi bekleniyor.
ASYNC_NETWORK_IO: İstemcinin veriyi alması bekleniyor.
sys.dm_exec_requests DMV’sini kullanarak sorgunun bekleme türü (wait_type) ve süresi (wait_time_ms) analiz edilebilir.
sys.dm_os_waiting_tasks DMV’si ile hangi kaynağın beklediği görülebilir.
Sonuç olarak: Suspended işlemler, genellikle disk, bellek, CPU veya bloklanan sorgular nedeniyle kaynak bekleyen işlemlerden kaynaklanır. Bloklama (blocking) en yaygın nedendir, ardından disk ve bellek problemleri gelir. Öncelikle sorguları ve sistem kaynaklarını analiz edip, optimize etmek gerekir. Kritik bir işlemdeysen, “KILL session_id” komutu ile işlemi manuel sonlandırabilirsin.
Eğer “Suspended” durumda olan bir işlem beklediği kaynakları (CPU, bellek, disk, kilit vb.) elde ederse, durumu şu şekilde değişir:
1. “Runnable” (Çalışmaya Hazır) olur.
İşlem beklediği kaynağı aldıktan sonra işlem kuyruğuna girer ve CPU’yu kullanmak için bekler.
Ancak hemen çalışmaz, çünkü SQL Server işlemleri CPU scheduler (zamanlayıcı) tarafından sıralar.
2. “Running” (Çalışıyor) duruma geçer.
CPU, işlemi çalıştırmak için uygun hale geldiğinde, işlem Running olur ve yürütülmeye devam eder.
Sonuç olarak:
Suspended -> Runnable -> Running Akışı
1. Suspended: Kaynak bekliyor (Disk, CPU, bellek veya başka bir işlem nedeniyle).
2. Runnable: Kaynak geldi, ama CPU kuyruğunda bekliyor.
3. Running: CPU zamanı aldı ve çalışıyor.
4. Completed
Sorgunun yürütülmesi tamamlanmış ve sonuca ulaşılmıştır. Bu durumda sorgunun çalışma süresi tamamlanmıştır ve işlemci kaynakları serbest bırakılmıştır. Ancak bu, sorgunun istemciye veri göndermesinin tamamlandığı anlamına gelmez. Sorgunun sonucu istemciye tamamen gönderilene kadar bu işlem devam edebilir. Bu durumda olan sorgular genelde sistem DMV’lerinde görünmez çünkü sorgu işlem sırasını tamamlamıştır.
5. Sleeping
Sorgu işlenmiş ve işlem tamamlanmıştır, ancak bağlantı hâlâ açık durumdadır. Bu durum, genellikle bir stored procedure veya oturumun (session) etkin kalmaya devam ettiği anlamına gelir. İşlem tamamlandığı için bağlantı CPU veya diğer sistem kaynaklarını kullanmaz. Bu durumda oturumu izlemek için sys.dm_exec_sessions DMV’si kullanılabilir. Sayfamızda Kill All Sleeping Sessions makalesini okuyarak sleeping modda olan sessionları kill edebilirsiniz.
Aşağıdaki komut sleeping modda olan komutları göstermektedir.
SELECT
s.session_id,
s.login_name,
s.status,
r.command,
r.cpu_time,
r.logical_reads,
r.reads,
r.writes,
t.text AS sql_text
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE s.status = 'sleeping';
6. BACKGROUND
SQL Server’da sp_who2 komutunu çalıştırdığınızda, belirli işlemler için Execution State alanında BACKGROUND ifadesini görebilirsiniz. Bu durum genellikle SQL Server tarafından otomatik olarak yürütülen sistem işlemleri için kullanılır. BACKGROUND, işlemin bir arka plan iş parçacığı olarak çalıştığını ve doğrudan bir kullanıcı sorgusuna bağlı olmadığını gösterir. Genellikle müdahale edilmesine gerek yoktur, ancak yüksek CPU veya bellek kullanımı varsa detaylı inceleme yapmak faydalı olabilir.
Bekleme Türleri (Wait Types)
SQL Server’daki sorgular genellikle Suspended durumunda bir kaynak beklediğinde çeşitli Wait Types durumlarıyla ilişkilendirilir. İşte bazı önemli bekleme türleri:
- ASYNC_NETWORK_IO: İstemcinin sonuçları alması bekleniyor.
- PAGEIOLATCH_: Verinin diskte fiziksel olarak okunması bekleniyor.
- LCK_M_: Bir tablo veya satır üzerindeki kilit çözülmeyi bekliyor.
- CXPACKET: Paralel yürütülen bir sorgunun iş parçacıklarının senkronize olmayı beklemesi.
Bu Durumların İzlenmesi
Bu durumları izlemek için aşağıdaki araçları kullanabilirsiniz:
1. Dynamic Management Views (DMV’ler):
- sys.dm_exec_requests: Aktif sorguların durumu.
- sys.dm_os_waiting_tasks: Bekleme türleri ve kaynakları.
2. Activity Monitor: SQL Server Management Studio (SSMS) içinde grafiksel olarak işlem durumlarını gözlemleyebilirsiniz.
3. Extended Events veya Profiler: Sorguların daha derinlemesine analizi için kullanılır.
Bu bilgiler sorgu optimizasyonunda, performans izleme ve sorun giderme işlemlerinde oldukça yardımcı olur. Başka bir makalede görüşmek dileğiyle..
“Ey Peygamber! Sakın zalimlerin yaptıklarından Allah’ın gâfil olduğunu sanma! Ancak Allah, onların cezalarını, gözlerin dışa fırlayacağı güne erteler.”İbrahim-42