Oracle bekleme aktivitesini ASH'den okumak, lisans konusu dahil
Active Session History, Oracle'ın tuttuğu en faydalı performans verisidir. Beraberinde, ilk sorgudan önce net bir yanıtı hak eden bir lisans sorusu da getirir.
ASH nedir
Active Session History her aktif oturumdan saniyede bir örnek alır ve örnekleri bellekte dairesel bir arabellekte tutar; bunlar V$ACTIVE_SESSION_HISTORY olarak görünür. Her on örnekten biri AWR'de DBA_HIST_ACTIVE_SESS_HISTORY olarak daha uzun süre saklanır. İstemcinin bir şey göndermesini bekleyen boştaki oturumlardan örnek alınmaz.
Bu da ASH'yi V$SYSTEM_EVENT'teki kümülatif sayaçlardan farklı türde bir veri yapar. Sayaçlar, başlangıçtan bu yana her bekleme olayına ne kadar zaman gittiğini söyler. ASH ise saniye saniye hangi oturumun ne yaptığını söyler: SQL ID, bekleme olayı veya CPU, modül ve program, ve beklenen nesne.
Önce lisans sorusu
ASH ve AWR, Enterprise Edition için ayrıca lisanslanan bir yönetim paketi olan Oracle Diagnostics Pack'in parçasıdır. V$ACTIVE_SESSION_HISTORY veya DBA_HIST görünümlerini sorgulamak, görünümler paket olmadan da mevcut olsa bile paketin kullanımı sayılır.
CONTROL_MANAGEMENT_PACK_ACCESS parametresi paketleri açar veya kapatır. Neyin parasını ödediğiniz hakkında hiçbir şey söylemez: Enterprise Edition'da varsayılan değeri açık konumdaki DIAGNOSTIC+TUNING'dir. Diagnostics Pack lisansınız yoksa NONE olarak ayarlayın.
Bu yüzden sorgulamadan önce lisansınızı kontrol edin; izleme araçlarınızın neyi sorguladığını da kontrol edin. Logstag ASH'yi yalnızca Enterprise Edition veya Oracle Database Free'de bu parametre DIAGNOSTIC içerdiğinde toplar; aksi halde ASH'yi atlar ve Wait Activity sekmesini lisanslı değil olarak gösterir. Bugün için bir istisna var: bir hedef eklediğinizde veya yeniden test ettiğinizde, agent'ın bağlantı testi ayardan bağımsız olarak ASH görünümünün okunabilir olup olmadığını bir kez kontrol eder.
Bekleme sürelerini toplamayın, örnekleri sayın
Her satır, bir saniyedeki bir aktif oturumdur. Bir dönem boyunca satırları saymak size saniye cinsinden veritabanı zamanını verir: 10 dakikada 600 örnek, ortalamada bir oturumun tüm süre boyunca aktif olduğu anlamına gelir. Örnekleri geçen saniyeye bölün; veritabanının ne kadar meşgul olduğunu gösteren en iyi tek sayıya, ortalama aktif oturuma ulaşırsınız.
TIME_WAITED sütunu cazip ama yanıltıcıdır. Yalnızca bir beklemenin son örneğinde, bekleme bittikten sonra doldurulur; aynı uzun beklemenin önceki örnekleri sıfır taşır ve hâlâ süren bir beklemenin henüz bir toplamı yoktur. Onu toplamak, bitmiş olan beklemelere fazla ağırlık verir ve hâlâ zarar verenleri kaçırır. Örnekleri sayın; tamamlanmış beklemelerin toplamını bir dipnot olarak ele alın. Logstag'in Wait Activity sekmesi de böyle düzenlenmiştir: önce örnek sayılarından aktivite, ikincil bir rakam olarak da tamamlanmış bekleme toplamı.
Soruların çoğunu yanıtlayan üç sorgu
Son 15 dakika nereye gitti: CPU'ya mı, hangi bekleme sınıfına mı? CPU'daki örneklerin bekleme sınıfı yoktur:
SELECT NVL(wait_class, 'CPU') AS activity, COUNT(*) AS samples FROM v$active_session_history WHERE sample_time > SYSDATE - INTERVAL '15' MINUTE GROUP BY NVL(wait_class, 'CPU') ORDER BY samples DESC;
Arkasındaki SQL, her ifadenin aktivitedeki payıyla:
SELECT sql_id, COUNT(*) AS samples,
ROUND(100 * RATIO_TO_REPORT(COUNT(*)) OVER (), 1) AS pct
FROM v$active_session_history
WHERE sample_time > SYSDATE - INTERVAL '15' MINUTE
AND sql_id IS NOT NULL
GROUP BY sql_id
ORDER BY samples DESC
FETCH FIRST 10 ROWS ONLY;
Tek bir ifadenin neyi beklediği:
SELECT NVL(event, 'ON CPU') AS event, COUNT(*) AS samples FROM v$active_session_history WHERE sql_id = :sql_id AND sample_time > SYSDATE - INTERVAL '15' MINUTE GROUP BY NVL(event, 'ON CPU') ORDER BY samples DESC;
Paket olmadan
Kümülatif görünümler ek lisans gerektirmez. V$SYSTEM_EVENT olaya göre beklemeleri verir (her sayaçta olduğu gibi farkları alın), V$SESSION her oturumun şu anda ne yaptığını, mevcut beklemesi, SQL ID'si ve kilitleyen oturumu dahil gösterir; V$SQLAREA ise ifade başına istatistikleri içerir. AWR'nin daha eski ve ücretsiz alternatifi Statspack hâlâ çalışır. Kaybettiğiniz şey her oturumun saniye saniye geçmişidir, beklemeleri görme yeteneği değil.
Logstag, ASH'nin lisanslı olmadığı yerlerde bunları toplar: oturumlar ve beklemeleri, boşta olmayan bekleme olayları, kilitlenen nesneyle birlikte kilitler ve V$SQLAREA'dan SQL performansı.
Multitenant
Bir pluggable database'e bağlıyken V$ACTIVE_SESSION_HISTORY o PDB'nin örneklerini gösterir. Logstag her PDB'ye ayrı bir hedef olarak bağlanır; böylece her birinin aktivitesi kendi başına gösterilir.
Kaynaklar
- Database Licensing Information User Manual (Diagnostics Pack), Oracle
- CONTROL_MANAGEMENT_PACK_ACCESS, Oracle Database Reference
- V$ACTIVE_SESSION_HISTORY, Oracle Database Reference