Minimizing System Contention ( 6- Wait Events by Class İncelemesi )
- Aşağıdaki sorgu, wait class ın farklı türlerini ve her wait class la ilişkili bekleme olaylarını gösterir.
SQL> select wait_class, name
from v$event_name
where name LIKE 'enq%'
and wait_class <> 'Other'
order by wait_class
WAIT_CLASS NAME
-------------------- --------------------------
Administrative enq: TW - contention
Concurrency enq: TX - index contention
…
- Çeşitli bekleme sınıflarına gruplanmış mevcut beklemeleri görüntülemek için aşağıdaki sorguyu çalıştırın:
SQL> select wait_class, sum(time_waited), sum(time_waited)/sum(total_waits)
sum_waits
from v$system_wait_class
group by wait_class
order by 3 desc;
WAIT_CLASS SUM(TIME_WAITED) SUM_WAITS
------------ ----------------- -----------
Idle 249659211 347.489249
Commit 1318006 236.795904
Concurrency 16126 4.818046
User I/O 135279 2.228869
Application 912 .0928055
Network 139 .0011209
…
- Idle wait class için çok yüksek bir bekleme görürseniz, endişelenmeyin, aslında, bunu herhangi bir sağlıklı veritabanında görmeyi beklemelisiniz. Bununla birlikte, tipik bir production ortamında, user I/O ve Application wait classes altında kesinlikle daha fazla bekleme görürsünüz. Veritabanının, örneğin Application wait classes veya user I/O wait class için çok büyük bir bekleme zamanı biriktiğini fark ederseniz, bu iki bekleme sınıfını daha ayrıntılı inceleme zamanı geldi demektir. Aşağıdaki örnekte, hangi belirli beklemelerin Application ve Concurrency class ları altında toplam bekleme süresinin yüksek olmasına neden olduğunu bulmak için birkaç wait classa bakıyoruz.
Bunu yapmak için V$SYSTEM_EVENT ve $EVENT_NAME viewlerini V$SYSTEM_WAIT_CLASS viewına ek olarak kullanırız.
Beklenen toplam süreye değil, bekleme olayının etkisini ölçmek için ortalama beklemeye odaklanın.
SQL> select a.event, a.total_waits, a.time_waited, a.average_wait
from v$system_event a, v$event_name b, v$system_wait_class c
where a.event_id=b.event_id
and b.wait_class#=c.wait_class#
and c.wait_class in ('Application','Concurrency')
order by average_wait desc;
EVENT TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
----------------------- ----------- ------------ -------------
enq: UL - contention 1 499 499.19
latch: shared pool 251 10944 43.6
library cache load lock 24 789 32.88
Tip: En yaygın Oracle bekleme olaylarından ikisi "db file scattered read" ve "db file sequential read" olaylarıdır.
"db file scattered read" bekleme olayı, büyük tabloların tam tablo taramalarından kaynaklanmaktadır.
Bu bekleme olayıyla karşılaşırsanız, tabloya veya tablolara index ekleme olasılığını araştırın.
Indexli okumalar nedeniyle de db file sequential read bekleme olayı gözlenir. Indexe eklenmiş bir okumanın iyi bir şeymiş gibi görünmesine rağmen, çok yüksek miktarda indexe eklenmiş okuma, ayarlamanız gereken verimsiz bir sorguyu potansiyel olarak gösterebilir. db file sequential read bekleme olayı için yüksek değerler, çok sayıda küçük indexli okumadan kaynaklanıyorsa, gerçekten bu sorun değil - bu veritabanında doğaldır.
- row lock contention a neden olduğu enqueue waits in, bu iki sınıfın altında en çok beklemeye neden olan şey olduğunu görebilirsiniz.
Artık veritabanındaki soruları yavaşlatan şeyin ne olduğunu biliyorsun! Performansı row lock contention dan etkilenen oturuma ulaşmak için aşağıdaki sorguyu kullanarak oturum düzeyini inceleyin:
SQL> select a.sid, a.event, a.total_waits, a.time_waited, a.average_wait
from v$session_event a, v$session b
where time_waited > 0
and a.sid=b.sid
and b.username is not NULL
and a.event='enq: TX - row lock contention';
SID EVENT TOTAL_WAITS time_waited average_wait
------ ------------------------------ ------------ ----------- ------------
68 enq: TX - row lock contention 24 8018 298
- Çıktı, SID 68 olan oturumun başka bir işlem tarafından tutulan bir satır kilidini beklediğini gösterir.
Nasıl Çalışır:
- Çeşitli Oracle bekleme olay sınıflarını anlamak, bekleme ile ilgili Oracle sorunlarını hızlı bir şekilde teşhis etme yeteneğinizi artırır. Bekleme olaylarını sınıflar halinde analiz etmek, contention, user I/O nun veya bir configuration sorununun yüksek beklemelerden sorumlu olup olmadığını size bildirmenizi sağlar.
Yukarıdaki bölümünde verilen örnekler, bekleme olay sınıflarına dayalı olarak bekleme analizinin nasıl başlatılacağını gösterir. Bu, bekleme kaynaklarını belirlemeye yardımcı olur. Beklentilerin çoğundan sorumlu bekleme olay sınıfını belirledikten sonra, bekleme olayı sınıfının yüksek toplam beklemelere katkıda bulunan belirli bekleme olaylarını bulmak için wait event class ı inceleyebilirsiniz. Daha sonra, son sorguyu kullanarak bekleme olaylarını bekleyen kullanıcı oturumlarını belirleyebilirsiniz.
Constraint Disable-Enable
Disable Constraint BEGIN FOR c IN (SELECT c.owner, c.table_name, c.constraint_name FROM user_constraints c, user_tables t WHERE...