2013-12-05 3 views
0

мне нужно сделать запрос на v$session_wait ищет события, мне нужно, чтобы получить событие с определенными значениями макса: Например:Oracle запросу с наличием

db file scattered read > 20 
db file sequential read > 25 
buffer busy waits > 30 
SQL*Net message from dblink > 20 
log file sync > 10 

И у меня есть этот запрос:

SELECT COUNT(*), event 
FROM v$session_wait 
WHERE event NOT IN ('pipe get','PL/SQL lock timer','SQL*Net more data from 
client','queue messages','SQL*Net message from client','pmon timer','rdbms ipc 
message','SQL*Net message to client','smon timer','wakeup time manager','virtual 
circuit status','wait for unread message on broadcast channel','jobq slave wait') 
AND event NOT LIKE 'Streams%AQ%' 
GROUP BY event 
HAVING COUNT('db file scattered read') >= 4 
OR COUNT('db file sequential read')  >= 4 
OR COUNT('buffer busy waits')   >= 7 
OR COUNT('latch free%')     >= 1 
OR COUNT('library cache%')    >= 8 
OR COUNT('enqueue')      >= 8 
OR COUNT('read by other session')  >= 8 
OR COUNT('log file sync')    >= 2 
OR COUNT('SQL*Net message from dblink') >= 2 
; 

Но результаты не то, что я хочу.

Мне нужно сгруппировать каждое событие и результат с максимальным значением выше.

Любая помощь?

+0

я думаю, что оно не работает следующим образом: ' COUNT ('db file sequential read') 'фильтр с фильтрами всех строк – Koryu

ответ

1

В этой ситуации пункт HAVING является неправильным. Вы можете переписать это так:

SELECT event,cnt 
FROM (
    SELECT COUNT(*) as cnt, event 
    FROM v$session_wait 
    WHERE event NOT IN (
     'pipe get', 'PL/SQL lock timer', 'SQL*Net more data from client', 
     'queue messages', 'SQL*Net message from client', 'pmon timer', 
     'rdbms ipc message', 'SQL*Net message to client', 'smon timer', 
     'wakeup time manager', 'virtual circuit status', 
     'wait for unread message on broadcast channel', 'jobq slave wait' 
     ) 
     AND event NOT LIKE 'Streams%AQ%' 
    GROUP BY event 
) a 
WHERE (CASE WHEN event = 'db file scattered read' AND cnt >= 4 THEN 1 
     WHEN event = 'db file sequential read' AND cnt >= 4 THEN 1 
     WHEN event = 'buffer busy waits' AND cnt >= 7 THEN 1 
     WHEN event = 'latch free%' AND cnt >= 1 THEN 1 
     WHEN event = 'library cache%' AND cnt >= 8 THEN 1 
     WHEN event = 'enqueue' AND cnt >= 8 THEN 1 
     WHEN event = 'read by other session' AND cnt >= 8 THEN 1 
     WHEN event = 'log file sync' AND cnt >= 2 THEN 1 
     WHEN event = 'SQL*Net message from dblink' AND cnt >= 2 THEN 1 
     ELSE 0 END) = 1 

Но если вы хотите строку, которая имеет MAX для COUNT на внутреннем запросе, вы можете просто сделать:

SELECT event,cnt 
FROM (
    SELECT COUNT(*) as cnt, event 
    FROM v$session_wait 
    WHERE event NOT IN (
     'pipe get', 'PL/SQL lock timer', 'SQL*Net more data from client', 
     'queue messages', 'SQL*Net message from client', 'pmon timer', 
     'rdbms ipc message', 'SQL*Net message to client', 'smon timer', 
     'wakeup time manager', 'virtual circuit status', 
     'wait for unread message on broadcast channel', 'jobq slave wait' 
     ) 
    AND event NOT LIKE 'Streams%AQ%' 
    GROUP BY event 
    ORDER BY COUNT(*) DESC 
) a 
WHERE ROWNUM = 1 
+0

вы были быстрее;) – Koryu

+0

Эй, спасибо, спасибо. Это то, что я искал, это хорошо работает. – Guido

Смежные вопросы