Veritabanı yavaş
Belirti
Uygulama genelinde yavaşlık; sorgular normalden çok uzun sürüyor, kullanıcılar şikayetçi.
1. Önce 'yavaş olan ne' sorusunu netleştir
Her şey mi yavaş yoksa belirli bir sorgu/ekran mı? Ne zaman başladı, bir deploy/patch/veri artışı ile örtüşüyor mu? Sistem genelinde mi yoksa tek DB'de mi? Bu, aramayı CPU/IO/lock/plan değişimi eksenlerinden birine daraltır.
2. Aktif oturumları ve wait event'leri gör
O an ne çalışıyor ve ne bekliyor? Yoğun bir wait event (IO, lock, log) darboğazı işaret eder.
Oracle
SELECT sid, username, status, event, sql_id FROM v$session WHERE status='ACTIVE' AND type='USER';PostgreSQL
SELECT pid, state, wait_event_type, wait_event, query FROM pg_stat_activity WHERE state='active';MySQL
SELECT id, user, command, time, state, info FROM information_schema.processlist WHERE command<>'Sleep' ORDER BY time DESC;SQL Server
SELECT session_id, status, wait_type, wait_time, blocking_session_id FROM sys.dm_exec_requests WHERE session_id IN (SELECT session_id FROM sys.dm_exec_sessions WHERE is_user_process = 1);MongoDB
db.currentOp({ active: true, secs_running: { $gt: 1 } })Redis
SLOWLOG GET 103. Bloklama var mı bak
Yavaşlığın en sık nedeni birinin diğerlerini bloklamasıdır. Bloklayan oturumu bulup zincirin başını tespit et.
Oracle
SELECT blocking_session, sid, seconds_in_wait, event FROM v$session WHERE blocking_session IS NOT NULL;PostgreSQL
SELECT pid, pg_blocking_pids(pid) AS blocked_by, query FROM pg_stat_activity WHERE cardinality(pg_blocking_pids(pid))>0;MySQL
SELECT * FROM sys.innodb_lock_waits\GSQL Server
SELECT session_id, blocking_session_id, wait_type FROM sys.dm_exec_requests WHERE blocking_session_id<>0;4. En maliyetli sorguları çıkar
Kaynağı en çok yiyen ilk 10 sorguyu bul. Genellikle sorunun %90'ı birkaç sorgudan gelir.
Oracle
SELECT sql_id, elapsed_time/1e6 sec, executions, sql_text FROM v$sql ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;PostgreSQL
SELECT calls, total_exec_time, mean_exec_time, query FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;MySQL
SELECT digest_text, count_star, sum_timer_wait/1e12 sec FROM performance_schema.events_statements_summary_by_digest ORDER BY sum_timer_wait DESC LIMIT 10;SQL Server
SELECT TOP 10 total_elapsed_time/execution_count avg_us, execution_count, SUBSTRING(t.text,1,200) FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) t ORDER BY total_elapsed_time DESC;5. Şüpheli sorgunun planını incele
Yavaş sorgu için EXPLAIN al. Tam tablo taraması (full scan), eksik index, kötü join sırası veya bayat istatistik ara. Plan aniden değiştiyse istatistik toplamayı düşün.
Oracle
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id', NULL, 'ALLSTATS LAST'));PostgreSQL
EXPLAIN (ANALYZE, BUFFERS) <sorgu>;MySQL
EXPLAIN ANALYZE <sorgu>;SQL Server
SET STATISTICS PROFILE ON; <sorgu>; SET STATISTICS PROFILE OFF;MongoDB
db.koleksiyon.find({...}).explain('executionStats') // COLLSCAN mı IXSCAN mı?6. Sistem kaynaklarını doğrula
OS düzeyinde CPU, IO bekleme (iowait), bellek ve disk doluluğuna bak. Cache hit oranını kontrol et; düşükse bellek darboğazı olabilir. Sorun DB dışında (disk dolu, komşu VM) olabilir.
7. Hızlı çözüm mü kalıcı çözüm mü karar ver
Acil rahatlama için: kaçak sorguyu kill et, eksik index'i ekle, istatistik topla. Kalıcı için: sorguyu/index'i yeniden tasarla, bellek ayarlarını düzelt, plan kararlılığını sağla (baseline/hint).