Документ создан: 16.02.2010

SQL

Отобразить выполнявшиеся запросы и частоту их выполнения

select count(*) count
      ,a.user_name username
      , b.sql_text sql_text
from v$open_cursor a
   , v$sqlarea b 
where a.address = b.address 
group by a.user_name
       , b.sql_text
having count(*) > 1 order by count(*) desc;

Запросы выполняемые в данный момент

select status
      , machine
      , osuser
      , username
      , a.sql_text
from v$session s
   , v$open_cursor o
   , v$sqlarea a
where s.saddr=o.saddr
  and s.sid=o.sid
  and o.address=a.address
  and o.hash_value=a.hash_value
  and user_name = 'USERNAME';

Длительные запросы

Длительные запросы, выполняемые в данный момент в определённой сессии. Нижеприведённый код выводит информацию о действии, выполненном объёме, общем объёме, проценте выполнения, единицах, времени, прошедшем с момента старта, и об оставшемся времени выполнения.

SELECT  decode(
          target_desc
          ,NULL
          ,decode(target,NULL,opname, concat(opname, concat (' - ',target))) 
          ,decode(target,NULL,concat(opname, concat (' : ',target_desc)) 
          ,concat(opname, concat (' : ',concat(target_desc,concat (' - ',target)))))) action
          ,sofar
          ,totalwork
          ,round(sofar*100/totalwork,2) percent
          ,units
          ,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (elapsed_seconds, 'second'),'hh24:mi:ss') elapsed_time
          ,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (time_remaining, 'second'),'hh24:mi:ss') time_remaining
FROM v$session_longops 
WHERE sid = 492 AND serial# = 2611;

то же, но для активных сессий:

SELECT  decode(
          target_desc
          ,NULL
          ,decode(target,NULL,opname, concat(opname, concat (' - ',target))) 
          ,decode(target,NULL,concat(opname, concat (' : ',target_desc)) 
          ,concat(opname, concat (' : ',concat(target_desc,concat (' - ',target)))))) action
          ,sofar
          ,totalwork
          ,round(sofar*100/totalwork,2) percent
          ,units
          ,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (elapsed_seconds, 'second'),'hh24:mi:ss') elapsed_time
          ,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (time_remaining, 'second'),'hh24:mi:ss') time_remaining
FROM v$session_longops 
WHERE (sid,serial#) in (select sid,serial# from v$session where status='ACTIVE');

Кто использует UNDO?

SELECT  s.sid, s.serial#, s.username, t.used_urec, t.used_ublk
FROM v$session s, v$transaction t
WHERE s.saddr = t.ses_addr
ORDER BY t.used_ublk DESC;

Противоположность DISTINCT

Как вывести только дублирующиеся записи? В таблице, которая выглядит так:

 Name                        Null?    Type
 --------------------------- -------- -----------------------------------------------------------
 ID                                   VARCHAR2(10)
 NAME                                 VARCHAR2(20)

можно использовать такой запрос:

select * from test group by id,name  having count(id||name) >1;

Строка с разделителями, как таблица.

Иногда возникает необходимость представить строку с разделителями, как таблицу. Я нашёл решение, описанное ниже (к сожалению, источник уже не могу вспомнить). Дано:

> select '&string' a  from dual;

A
---------------------------------------------
r1_c1: r1_c2;r2_c1: r2_c2;r3_c1: r3_c1

"Хитрым" запросом получаем таблицу:

> select regexp_substr('&string','[^;]+', 1, level) a from dual connect by regexp_substr('&string','[^;]+', 1, level) is not null;

A
---------------------------------------------
r1_c1: r1_c2
r2_c1: r2_c2
r3_c1: r3_c1

Если же ещё немного дополнить запрос, то получаем таблицу с разными колонками:

> with tab as (
2  select regexp_substr('&string','[^;]+', 1, level) a from dual connect by regexp_substr('&string','[^;]+', 1, level) is not null
3  )
4  select substr(a, 1, instr(a, ':')-1) as column1
5       , substr(a, instr(a, ':')+2) as column2
6  from tab
7  ;
 
COLUMN1    COLUMN2
---------- ----------
r1_c1      r1_c2
r2_c1      r2_c2
r3_c1      r3_c1
 
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate