Oracle mechanics

Scripts

Администрирование

Параметры Oracle: открытые и “скрытые” (hidden)

Список “скрытых” (hidden) параметров

Запрос Т.Кайта для нахождения столбцов с ограничениями ссылочной целостности без индексов (Unindexed Foreign Keys)

Тот же запрос для Oracle 11g из комментария к блогу Т.Кайта

Актуальные блоки бд, занятые строками сегмента таблицы/матвьюшки (в отсутствии chained rows)

ORA-30036: кто съел UNDO?

Мониторинг, ожидания

Текущие ожидания, запросы, longops и прочая информация пользовательских сессий (Oracle 10+, с учётом RAC)

Тот же скрипт для Oracle 9,8

Суммарные ожидания  активных сессий

SQL запросы, планы, оптимизатор

Дерево зависимостей/иерархия используемых SQL запросом объектов по SQL_ID

Дерево зависимых объектов по OWNER, OBJECT_NAME

sqltext_to_sqlid

Outline секция реального плана выполнения, из V$SQL_PLAN

Подсказки, прописанные в SQL PLAN BASELINE

Связанные переменные, использованные при генерации плана, из V$SQL_PLAN/DBA_HIST_SQL_PLAN.OTHER_XML

INFO section from V$SQL_PLAN/DBA_HIST_SQL_PLAN.OTHER_XML

Предикаты, добавляемые VPD | RLS | FGAC для запросов из кэша (v$sql.sql_id)

SGA shared pool

Причины большого значения версий (high version count)/повторного неиспользования курсоров из обзора V$SQL_SHARED_CURSOR по SQL_ID для Oracle 10g

Тот же запрос для Oracle 11g

Удаление курсора из shared pool по sql_id

SQL утилиты

Dion Cho: SQL реализация утилиты OERR для Windows

PL/SQL

Процедура переноса статистики таблицы/схемы через db link (например, с production на тестовую бд)

CRS / bash

crs_stat с “человеческим лицом”


-----------------------------------------------------------------------------------
--Currently connected sessions waits, longops, sql, etc...
--Oracle 10+ single instance and RAC env.
--I.Usoltsev
-----------------------------------------------------------------------------------
select/*+ RULE*/ distinct--because of multiple records in v$sql for PREV_SQL
to_char(gv$session.LOGON_TIME,'YYYY.MM.DD HH24:MI:SS') as LOGON_TIME
, gv$transaction.START_TIME as TX_STIME
, gv$session.LAST_CALL_ET as LAST_CALL_ET
, gv$session.STATUS
, gv$session.USERNAME
, gv$session.PROGRAM
, gv$session.SERVICE_NAME as service
, gv$session.INST_ID
, gv$session.SID
, gv$session.SERIAL#
, decode(gv$session_wait.state, 'WAITING', gv$session_wait.EVENT,
'On CPU / runqueue') as EVENT
, v$latchname.NAME as LATCHNAME
, gv$latchholder.sid
, gv$session_wait.SECONDS_IN_WAIT
, dba_objects.owner||'.'||dba_objects.object_name req_object
, decode(nvl(gv$session.ROW_WAIT_OBJ#,-1),-1,'NONE'
, DBMS_ROWID.ROWID_CREATE( 1, gv$session.ROW_WAIT_OBJ#
, gv$session.ROW_WAIT_FILE#, gv$session.ROW_WAIT_BLOCK#
, gv$session.ROW_WAIT_ROW# )) req_rowid
, lockhold.inst_id as BLOCKING_INSTANCE
, lockhold.sid as BLOCKING_SESSION
, gv$session.COMMAND
, gv$session_longops.TIME_REMAINING as LONGOPS_CALL_RT
, gv$session_longops.MESSAGE as LONGOPS_MESSAGE
, gv$session_wait.P1
, gv$session_wait.P1TEXT
, gv$session_wait.P1RAW /* X$BH.HLADDR for LATCH: CACHE BUFFERS CHAINS */
, gv$session_wait.P2 P2
, gv$session_wait.P2TEXT
, gv$session_wait.P3
, gv$session_wait.P3TEXT
, ses_optimizer_env38.VALUE as ses_optimizer_mode
, ses_optimizer_env48.VALUE as ses_cursor_sharing
, gv$sql.SQL_ID as SQL_ID
, gv$sql.PLAN_HASH_VALUE as PLAN_HASH_VALUE
, gv$sql.OPTIMIZER_MODE as SQL_OPTIMIZER_MODE
, gv$sql.sql_text as SQL_TEXT
, gv$sql.SQL_PROFILE
, gv$session.SQL_CHILD_NUMBER SQL_CHILD_NUMBER
, sql1.SQL_ID as PREV_SQL_ID
, sql1.PLAN_HASH_VALUE as PREV_PLAN_HASH_VALUE
, sql1.OPTIMIZER_MODE as PREV_SQL_OPTIMIZER_MODE
, sql1.sql_text as PREV_sql_text
, gv$session.PREV_CHILD_NUMBER
--Network connection properties
, gv$session.SERVER
, gv$session.FAILOVER_TYPE
, gv$session.FAILOVER_METHOD
, gv$session.FAILED_OVER
, gv$session.FIXED_TABLE_SEQUENCE
--OS properties
, gv$session.MACHINE
, gv$session.MODULE
, gv$session.OSUSER
, gv$session.OWNERID
, gv$session.TERMINAL
, 'Alter system kill session '''||gv$session.SID||','||gv$session.SERIAL#
||''';' as KILL_SESSION
--, gv$session.PROCESS
, gv$instance.HOST_NAME
, 'kill -9 '||gv$process.SPID as KILL_SPID
-- from 10g and above - SQL Trace info
, gv$session.SQL_TRACE, gv$session.SQL_TRACE_WAITS, gv$session.SQL_TRACE_BINDS
, 'begin sys.dbms_support.start_trace_in_session('||gv$session.SID||','||
gv$session.SERIAL#||', waits=>TRUE, binds=>TRUE );end;'
, 'begin sys.dbms_support.stop_trace_in_session('||gv$session.SID||','||
gv$session.SERIAL#||' );end;'
from gv$session
, gv$instance
, gv$process
, gv$session_wait
, gv$sql
, gv$sql sql1
, gv$transaction
, v$latchname
, dba_objects
, gv$session_longops
, gv$ses_optimizer_env ses_optimizer_env38
, gv$ses_optimizer_env ses_optimizer_env48
, gv$lock lockwait
, gv$lock lockhold
, gv$latchholder
where gv$session.INST_ID = gv$instance.INST_ID
and gv$session.PADDR=gv$process.ADDR(+)
and gv$session.INST_ID = gv$process.INST_ID(+)
and gv$session.sql_address=gv$sql.address(+)
and gv$session.sql_hash_value=gv$sql.hash_value(+)
and gv$session.SQL_CHILD_NUMBER = gv$sql.CHILD_NUMBER(+)
and gv$session.INST_ID = gv$sql.INST_ID(+)
and gv$session.PREV_SQL_ADDR = sql1.address(+)
and gv$session.PREV_HASH_VALUE = sql1.hash_value(+)
and gv$session.PREV_CHILD_NUMBER = sql1.CHILD_NUMBER(+)
and gv$session.SID=gv$session_wait.SID(+)
and gv$session.INST_ID = gv$session_wait.INST_ID(+)
and gv$session.SADDR=gv$transaction.SES_ADDR(+)
and gv$session.INST_ID = gv$transaction.INST_ID(+)
and gv$session.SERVICE_NAME not in ('SYS$BACKGROUND')
and gv$session.PROGRAM not like '%QMNC%' --Queue Monitor Coordinator excluded
and gv$session.PROGRAM not like '%q00%' --Queue monitor processes excluded
--and v$session.PROGRAM not like '%J00%' --DBMS_JOB processes excluded
and gv$session_wait.P2=v$latchname.LATCH#(+)
and gv$session_wait.p1raw = gv$latchholder.laddr(+)
and gv$session.ROW_WAIT_OBJ# = dba_objects.object_id(+)
and gv$session.SID = gv$session_longops.sid(+)
and gv$session.INST_ID = gv$session_longops.INST_ID(+)
and gv$session.SERIAL# = gv$session_longops.SERIAL#(+)
and gv$session.sql_address = gv$session_longops.SQL_ADDRESS(+)
and gv$session.sql_hash_value = gv$session_longops.SQL_HASH_VALUE(+)
and (nvl(gv$session_longops.TIME_REMAINING, 1) > 0
     or
     nvl(gv$session_longops.START_TIME, sysdate) = (select max(START_TIME) from gv$session_longops gsl where gv$session.SID = gsl.sid and  gv$session.INST_ID = gsl.INST_ID and gv$session.SERIAL# = gsl.SERIAL# and gv$session.sql_address = gsl.SQL_ADDRESS and gv$session.sql_hash_value = gsl.SQL_HASH_VALUE))
and gv$session.sid = ses_optimizer_env38.sid(+)
and gv$session.INST_ID = ses_optimizer_env38.INST_ID(+)
and nvl(ses_optimizer_env38.id,38) = 38 --optimizer_mode
and gv$session.sid = ses_optimizer_env48.sid(+)
and gv$session.INST_ID = ses_optimizer_env48.INST_ID(+)
and nvl(ses_optimizer_env48.id, 48) = 48--cursor_sharing
and gv$session.LOCKWAIT = lockwait.KADDR(+)
and lockwait.id1 = lockhold.id1(+)
and lockwait.id2 = lockhold.id2(+)
and nvl(lockwait.REQUEST,1) > 0
and nvl(lockwait.LMODE,0) = 0
and nvl(lockhold.REQUEST,0) = 0
and nvl(lockhold.LMODE,1) > 0
and nvl(lockwait.SID,0) <> nvl(lockhold.SID,1)
order by tx_stime, status, LOGON_TIME, username, gv$session.sid;

-----------------------------------------------------------------------------------
--Currently connected sessions waits, longops, sql, etc... Oracle 9-
--single instance and RAC env.
--I.Usoltsev
-----------------------------------------------------------------------------------
select/*+ rule*/ distinct--because of multiple records in v$sql may exist
to_char(gv$session.LOGON_TIME,'YYYY.MM.DD HH24:MI:SS') as LOGON_TIME
, gv$session.STATUS
, gv$session.USERNAME
, gv$session.PROGRAM
, gv$session.INST_ID
, gv$session.SID
, gv$session.SERIAL#
, gv$transaction.START_TIME as TX_STIME
, gv$session.LAST_CALL_ET as LAST_CALL_ET
, gv$session_wait.EVENT
, v$latchname.NAME as LATCHNAME
, gv$session_wait.SECONDS_IN_WAIT
, dba_objects.owner||'.'||dba_objects.object_name req_object
, decode(nvl(gv$session.ROW_WAIT_OBJ#,-1),-1,'NONE',DBMS_ROWID.ROWID_CREATE( 1,
gv$session.ROW_WAIT_OBJ#, gv$session.ROW_WAIT_FILE#, gv$session.ROW_WAIT_BLOCK#,
gv$session.ROW_WAIT_ROW# )) req_rowid
, lockhold.inst_id as BLOCKING_INSTANCE
, lockhold.sid as BLOCKING_SESSION
, gv$session.COMMAND
, gv$session_longops.TIME_REMAINING as LONGOPS_CALL_RT
, gv$session_longops.MESSAGE as LONGOPS_MESSAGE
, gv$session_wait.P1
, gv$session_wait.P1TEXT
, gv$session_wait.P2 P2
, gv$session_wait.P2TEXT
, gv$session_wait.P3
, gv$session_wait.P3TEXT
, gv$sql.ADDRESS as SQL_ADDRESS
, gv$sql.HASH_VALUE as HASH_VALUE
, gv$sql.PLAN_HASH_VALUE as PLAN_HASH_VALUE
, gv$sql.OPTIMIZER_MODE as SQL_OPTIMIZER_MODE
, gv$sql.sql_text as SQL_TEXT
, sql1.ADDRESS as PREV_SQL_ADDRESS
, sql1.HASH_VALUE as PREV_HASH_VALUE
, sql1.PLAN_HASH_VALUE as PREV_PLAN_HASH_VALUE
, sql1.OPTIMIZER_MODE as PREV_SQL_OPTIMIZER_MODE
, sql1.sql_text as PREV_sql_text
--Network connection properties
, gv$session.SERVER
, gv$session.FAILOVER_TYPE
, gv$session.FAILOVER_METHOD
, gv$session.FAILED_OVER
, gv$session.FIXED_TABLE_SEQUENCE
--OS properties
, gv$session.MACHINE
, gv$session.MODULE
, gv$session.OSUSER
, gv$session.OWNERID
, gv$session.TERMINAL
, 'Alter system kill session '''||gv$session.SID||','||gv$session.SERIAL#||''';'
as KILL_SESSION
, gv$instance.HOST_NAME
, 'kill '||gv$process.SPID as KILL_SPID
from gv$session
, gv$instance
, gv$process
, gv$session_wait
, gv$sql
, gv$sql sql1
, gv$transaction
, v$latchname
, dba_objects
, gv$session_longops
, gv$lock lockwait
, gv$lock lockhold
where gv$session.INST_ID = gv$instance.INST_ID
and gv$session.PADDR=gv$process.ADDR(+)
and gv$session.INST_ID = gv$process.INST_ID(+)
and gv$session.sql_address=gv$sql.address(+)
and gv$session.INST_ID = gv$sql.INST_ID(+)
and gv$session.sql_hash_value=gv$sql.hash_value(+)
and gv$session.PREV_SQL_ADDR = sql1.address(+)
and gv$session.PREV_HASH_VALUE = sql1.hash_value(+)
and gv$session.SID=gv$session_wait.SID(+)
and gv$session.INST_ID = gv$session_wait.INST_ID(+)
and gv$session.SADDR=gv$transaction.SES_ADDR(+)
and gv$session.INST_ID = gv$transaction.INST_ID(+)
and (gv$session.SERIAL# <> 1 or upper(gv$session.PROGRAM) like '%LGWR%'
or upper(gv$session.PROGRAM) like '%DBW%' )--System session excluded,exc. DBWR
and upper(gv$session.PROGRAM) not like '%QMNC%'--Queue Monitor Coordinator excluded
and upper(gv$session.PROGRAM) not like '%Q0%'--Queue monitor processes excluded
and gv$session_wait.P2=v$latchname.LATCH#(+)
and gv$session.ROW_WAIT_OBJ# = dba_objects.object_id(+)
and gv$session.SID = gv$session_longops.sid(+)
and gv$session.INST_ID = gv$session_longops.INST_ID(+)
and gv$session.SERIAL# = gv$session_longops.SERIAL#(+)
and gv$session.sql_address = gv$session_longops.SQL_ADDRESS(+)
and gv$session.sql_hash_value = gv$session_longops.SQL_HASH_VALUE(+)
and nvl(gv$session_longops.SOFAR,0) <> nvl(gv$session_longops.TOTALWORK,1)
and gv$session.LOCKWAIT = lockwait.KADDR(+)
and lockwait.id1 = lockhold.id1(+)
and lockwait.id2 = lockhold.id2(+)
and nvl(lockwait.REQUEST,1) > 0
and	nvl(lockwait.LMODE,0) = 0
and nvl(lockhold.REQUEST,0) = 0
and	nvl(lockhold.LMODE,1) > 0
and nvl(lockwait.SID,0) <> nvl(lockhold.SID,1)
order by tx_stime, status, LOGON_TIME, username, machine asc;

-----------------------------------------------------------------------------------
--Active session summary waits ratio
--I.Usoltsev
-----------------------------------------------------------------------------------
select WAIT_EVENT
,lpad(TO_CHAR(PCTTOT,'990D99'),6)||'% waits with average duration ='
||TO_CHAR(AVERAGE_WAIT_MS,'9990D99')||'ms' as EVENT_VALUES
from (
select --RANK() OVER (order by sum(time_waited) desc)  as RANK,
event as WAIT_EVENT--, sum(time_waited) time_waited_ms
,round(RATIO_TO_REPORT(sum(time_waited)) OVER ()*100,2) AS PCTTOT
,round(avg(average_wait)*10,2) as AVERAGE_WAIT_MS
from
(select se.SID, se.INST_ID, se.EVENT, se.TIME_WAITED,
se.AVERAGE_WAIT from gv$session_event se
where se.WAIT_CLASS not in ('Idle')
union
select ss.SID, ss.INST_ID, sn.NAME as EVENT
, ss.VALUE as TIME_WAITED
, 0 as AVERAGE_WAIT from gv$sesstat ss, v$statname sn
where ss."STATISTIC#" = sn."STATISTIC#"
and sn.NAME in ('CPU used when call started'))
where (sid, inst_id) in
(select sid, inst_id from gv$session
where gv$session.SERVICE_NAME not in ('SYS$BACKGROUND'))
group by event
order by PCTTOT desc) we;

-----------------------------------------------------------------------------------
--select view_definition from v$fixed_view_definition where view_name = 'GV$PARAMETER'
--and comment out the last "hiding" conditions
--I.Usoltsev
-----------------------------------------------------------------------------------
select x.inst_id as "INST_ID",
x.indx + 1 as "NUM",
ksppinm as "NAME",
ksppity as "TYPE",
ksppstvl as "VALUE",
ksppstdvl as "DISPLAY_VALUE",
ksppstdf as "ISDEFAULT",
decode(bitand(ksppiflg / 256, 1), 1, 'TRUE', 'FALSE') as "ISSES_MODIFIABLE",
decode(bitand(ksppiflg / 65536, 3),
1,'IMMEDIATE',2,'DEFERRED',3,'IMMEDIATE','FALSE') as "ISSYS_MODIFIABLE",
decode(bitand(ksppiflg, 4),4,'FALSE',
decode(bitand(ksppiflg / 65536, 3), 0, 'FALSE', 'TRUE')) as "ISINSTANCE_MODIFIABLE",
decode(bitand(ksppstvf, 7), 1, 'MODIFIED', 4, 'SYSTEM_MOD', 'FALSE') as "ISMODIFIED",
decode(bitand(ksppstvf, 2), 2, 'TRUE', 'FALSE') as "ISADJUSTED",
decode(bitand(ksppilrmflg / 64, 1), 1, 'TRUE', 'FALSE') as "ISDEPRECATED",
decode(bitand(ksppilrmflg / 268435456, 1), 1, 'TRUE', 'FALSE') as "ISBASIC",
ksppdesc as "DESCRIPTION",
ksppstcmnt as "UPDATE_COMMENT",
ksppihash as "HASH"
from x$ksppi x, x$ksppcv y
where (x.indx = y.indx)
--and ((translate(ksppinm, '_', '#') not like '##%')
--and ((translate(ksppinm, '_', '#') not like '#%')
--      or (ksppstdf = 'FALSE') or (bitand(ksppstvf, 5) > 0)));

-------------------------------------------------------------------
-------------------------------------------------------------------
select/*+RULE*/ sql_id as sql_id, version_count, address, hash_value, parsing_schema_name, reason, sql_text from (
select sql_id, address
 , decode(max(                UNBOUND_CURSOR),'Y',               ' UNBOUND_CURSOR')
 ||decode(max(             SQL_TYPE_MISMATCH),'Y',            ' SQL_TYPE_MISMATCH')
 ||decode(max(            OPTIMIZER_MISMATCH),'Y',           ' OPTIMIZER_MISMATCH')
 ||decode(max(              OUTLINE_MISMATCH),'Y',             ' OUTLINE_MISMATCH')
 ||decode(max(            STATS_ROW_MISMATCH),'Y',           ' STATS_ROW_MISMATCH')
 ||decode(max(              LITERAL_MISMATCH),'Y',             ' LITERAL_MISMATCH')
 ||decode(max(            SEC_DEPTH_MISMATCH),'Y',           ' SEC_DEPTH_MISMATCH')
 ||decode(max(           EXPLAIN_PLAN_CURSOR),'Y',          ' EXPLAIN_PLAN_CURSOR')
 ||decode(max(         BUFFERED_DML_MISMATCH),'Y',        ' BUFFERED_DML_MISMATCH')
 ||decode(max(             PDML_ENV_MISMATCH),'Y',            ' PDML_ENV_MISMATCH')
 ||decode(max(           INST_DRTLD_MISMATCH),'Y',          ' INST_DRTLD_MISMATCH')
 ||decode(max(             SLAVE_QC_MISMATCH),'Y',            ' SLAVE_QC_MISMATCH')
 ||decode(max(            TYPECHECK_MISMATCH),'Y',           ' TYPECHECK_MISMATCH')
 ||decode(max(           AUTH_CHECK_MISMATCH),'Y',          ' AUTH_CHECK_MISMATCH')
 ||decode(max(                 BIND_MISMATCH),'Y',                ' BIND_MISMATCH')
 ||decode(max(             DESCRIBE_MISMATCH),'Y',            ' DESCRIBE_MISMATCH')
 ||decode(max(             LANGUAGE_MISMATCH),'Y',            ' LANGUAGE_MISMATCH')
 ||decode(max(          TRANSLATION_MISMATCH),'Y',         ' TRANSLATION_MISMATCH')
 ||decode(max(        ROW_LEVEL_SEC_MISMATCH),'Y',       ' ROW_LEVEL_SEC_MISMATCH')
 ||decode(max(                  INSUFF_PRIVS),'Y',                 ' INSUFF_PRIVS')
 ||decode(max(              INSUFF_PRIVS_REM),'Y',             ' INSUFF_PRIVS_REM')
 ||decode(max(         REMOTE_TRANS_MISMATCH),'Y',        ' REMOTE_TRANS_MISMATCH')
 ||decode(max(     LOGMINER_SESSION_MISMATCH),'Y',    ' LOGMINER_SESSION_MISMATCH')
 ||decode(max(          INCOMP_LTRL_MISMATCH),'Y',         ' INCOMP_LTRL_MISMATCH')
 ||decode(max(         OVERLAP_TIME_MISMATCH),'Y',        ' OVERLAP_TIME_MISMATCH')
 ||decode(max(         SQL_REDIRECT_MISMATCH),'Y',        ' SQL_REDIRECT_MISMATCH')
 ||decode(max(         MV_QUERY_GEN_MISMATCH),'Y',        ' MV_QUERY_GEN_MISMATCH')
 ||decode(max(       USER_BIND_PEEK_MISMATCH),'Y',      ' USER_BIND_PEEK_MISMATCH')
 ||decode(max(           TYPCHK_DEP_MISMATCH),'Y',          ' TYPCHK_DEP_MISMATCH')
 ||decode(max(           NO_TRIGGER_MISMATCH),'Y',          ' NO_TRIGGER_MISMATCH')
 ||decode(max(              FLASHBACK_CURSOR),'Y',             ' FLASHBACK_CURSOR')
 ||decode(max(        ANYDATA_TRANSFORMATION),'Y',       ' ANYDATA_TRANSFORMATION')
 ||decode(max(             INCOMPLETE_CURSOR),'Y',            ' INCOMPLETE_CURSOR')
 ||decode(max(          TOP_LEVEL_RPI_CURSOR),'Y',         ' TOP_LEVEL_RPI_CURSOR')
 ||decode(max(         DIFFERENT_LONG_LENGTH),'Y',        ' DIFFERENT_LONG_LENGTH')
 ||decode(max(         LOGICAL_STANDBY_APPLY),'Y',        ' LOGICAL_STANDBY_APPLY')
 ||decode(max(                DIFF_CALL_DURN),'Y',               ' DIFF_CALL_DURN')
 ||decode(max(                BIND_UACS_DIFF),'Y',               ' BIND_UACS_DIFF')
 ||decode(max(        PLSQL_CMP_SWITCHS_DIFF),'Y',       ' PLSQL_CMP_SWITCHS_DIFF')
 ||decode(max(         CURSOR_PARTS_MISMATCH),'Y',        ' CURSOR_PARTS_MISMATCH')
 ||decode(max(           STB_OBJECT_MISMATCH),'Y',          ' STB_OBJECT_MISMATCH')
 ||decode(max(             ROW_SHIP_MISMATCH),'Y',            ' ROW_SHIP_MISMATCH')
 ||decode(max(             PQ_SLAVE_MISMATCH),'Y',            ' PQ_SLAVE_MISMATCH')
 ||decode(max(        TOP_LEVEL_DDL_MISMATCH),'Y',       ' TOP_LEVEL_DDL_MISMATCH')
 ||decode(max(             MULTI_PX_MISMATCH),'Y',            ' MULTI_PX_MISMATCH')
 ||decode(max(       BIND_PEEKED_PQ_MISMATCH),'Y',      ' BIND_PEEKED_PQ_MISMATCH')
 ||decode(max(           MV_REWRITE_MISMATCH),'Y',          ' MV_REWRITE_MISMATCH')
 ||decode(max(         ROLL_INVALID_MISMATCH),'Y',        ' ROLL_INVALID_MISMATCH')
 ||decode(max(       OPTIMIZER_MODE_MISMATCH),'Y',      ' OPTIMIZER_MODE_MISMATCH')
 ||decode(max(                   PX_MISMATCH),'Y',                  ' PX_MISMATCH')
 ||decode(max(          MV_STALEOBJ_MISMATCH),'Y',         ' MV_STALEOBJ_MISMATCH')
 ||decode(max(      FLASHBACK_TABLE_MISMATCH),'Y',     ' FLASHBACK_TABLE_MISMATCH')
 ||decode(max(          LITREP_COMP_MISMATCH),'Y',         ' LITREP_COMP_MISMATCH')
 reason
from v$sql_shared_cursor
   where sql_id = '&sql_id'
group by
   sql_id, address
) join v$sqlarea using(address, sql_id)
where version_count>1
order by version_count desc,address;

-------------------------------------------------------------------
--From 11.1.0.7 patchset
-------------------------------------------------------------------
select/*+RULE*/ sql_id as sql_id, version_count, address, hash_value, parsing_schema_name, reason, sql_text from (
select sql_id, address
 , decode(max(                UNBOUND_CURSOR),'Y',               ' UNBOUND_CURSOR')
 ||decode(max(             SQL_TYPE_MISMATCH),'Y',            ' SQL_TYPE_MISMATCH')
 ||decode(max(            OPTIMIZER_MISMATCH),'Y',           ' OPTIMIZER_MISMATCH')
 ||decode(max(              OUTLINE_MISMATCH),'Y',             ' OUTLINE_MISMATCH')
 ||decode(max(            STATS_ROW_MISMATCH),'Y',           ' STATS_ROW_MISMATCH')
 ||decode(max(              LITERAL_MISMATCH),'Y',             ' LITERAL_MISMATCH')
-- ||decode(max(            SEC_DEPTH_MISMATCH),'Y',           ' SEC_DEPTH_MISMATCH')
 ||decode(max(           EXPLAIN_PLAN_CURSOR),'Y',          ' EXPLAIN_PLAN_CURSOR')
 ||decode(max(         BUFFERED_DML_MISMATCH),'Y',        ' BUFFERED_DML_MISMATCH')
 ||decode(max(             PDML_ENV_MISMATCH),'Y',            ' PDML_ENV_MISMATCH')
 ||decode(max(           INST_DRTLD_MISMATCH),'Y',          ' INST_DRTLD_MISMATCH')
 ||decode(max(             SLAVE_QC_MISMATCH),'Y',            ' SLAVE_QC_MISMATCH')
 ||decode(max(            TYPECHECK_MISMATCH),'Y',           ' TYPECHECK_MISMATCH')
 ||decode(max(           AUTH_CHECK_MISMATCH),'Y',          ' AUTH_CHECK_MISMATCH')
 ||decode(max(                 BIND_MISMATCH),'Y',                ' BIND_MISMATCH')
 ||decode(max(             DESCRIBE_MISMATCH),'Y',            ' DESCRIBE_MISMATCH')
 ||decode(max(             LANGUAGE_MISMATCH),'Y',            ' LANGUAGE_MISMATCH')
 ||decode(max(          TRANSLATION_MISMATCH),'Y',         ' TRANSLATION_MISMATCH')
-- ||decode(max(        ROW_LEVEL_SEC_MISMATCH),'Y',       ' ROW_LEVEL_SEC_MISMATCH')
 ||decode(max(                  INSUFF_PRIVS),'Y',                 ' INSUFF_PRIVS')
 ||decode(max(              INSUFF_PRIVS_REM),'Y',             ' INSUFF_PRIVS_REM')
 ||decode(max(         REMOTE_TRANS_MISMATCH),'Y',        ' REMOTE_TRANS_MISMATCH')
 ||decode(max(     LOGMINER_SESSION_MISMATCH),'Y',    ' LOGMINER_SESSION_MISMATCH')
 ||decode(max(          INCOMP_LTRL_MISMATCH),'Y',         ' INCOMP_LTRL_MISMATCH')
 ||decode(max(         OVERLAP_TIME_MISMATCH),'Y',        ' OVERLAP_TIME_MISMATCH')
-- ||decode(max(         SQL_REDIRECT_MISMATCH),'Y',        ' SQL_REDIRECT_MISMATCH')
 ||decode(max(         MV_QUERY_GEN_MISMATCH),'Y',        ' MV_QUERY_GEN_MISMATCH')
 ||decode(max(       USER_BIND_PEEK_MISMATCH),'Y',      ' USER_BIND_PEEK_MISMATCH')
 ||decode(max(           TYPCHK_DEP_MISMATCH),'Y',          ' TYPCHK_DEP_MISMATCH')
 ||decode(max(           NO_TRIGGER_MISMATCH),'Y',          ' NO_TRIGGER_MISMATCH')
 ||decode(max(              FLASHBACK_CURSOR),'Y',             ' FLASHBACK_CURSOR')
 ||decode(max(        ANYDATA_TRANSFORMATION),'Y',       ' ANYDATA_TRANSFORMATION')
 ||decode(max(             INCOMPLETE_CURSOR),'Y',            ' INCOMPLETE_CURSOR')
 ||decode(max(          TOP_LEVEL_RPI_CURSOR),'Y',         ' TOP_LEVEL_RPI_CURSOR')
 ||decode(max(         DIFFERENT_LONG_LENGTH),'Y',        ' DIFFERENT_LONG_LENGTH')
 ||decode(max(         LOGICAL_STANDBY_APPLY),'Y',        ' LOGICAL_STANDBY_APPLY')
 ||decode(max(                DIFF_CALL_DURN),'Y',               ' DIFF_CALL_DURN')
 ||decode(max(                BIND_UACS_DIFF),'Y',               ' BIND_UACS_DIFF')
 ||decode(max(        PLSQL_CMP_SWITCHS_DIFF),'Y',       ' PLSQL_CMP_SWITCHS_DIFF')
 ||decode(max(         CURSOR_PARTS_MISMATCH),'Y',        ' CURSOR_PARTS_MISMATCH')
 ||decode(max(           STB_OBJECT_MISMATCH),'Y',          ' STB_OBJECT_MISMATCH')
-- ||decode(max(             ROW_SHIP_MISMATCH),'Y',            ' ROW_SHIP_MISMATCH')
 ||decode(max(             PQ_SLAVE_MISMATCH),'Y',            ' PQ_SLAVE_MISMATCH')
 ||decode(max(        TOP_LEVEL_DDL_MISMATCH),'Y',       ' TOP_LEVEL_DDL_MISMATCH')
 ||decode(max(             MULTI_PX_MISMATCH),'Y',            ' MULTI_PX_MISMATCH')
 ||decode(max(       BIND_PEEKED_PQ_MISMATCH),'Y',      ' BIND_PEEKED_PQ_MISMATCH')
 ||decode(max(           MV_REWRITE_MISMATCH),'Y',          ' MV_REWRITE_MISMATCH')
 ||decode(max(         ROLL_INVALID_MISMATCH),'Y',        ' ROLL_INVALID_MISMATCH')
 ||decode(max(       OPTIMIZER_MODE_MISMATCH),'Y',      ' OPTIMIZER_MODE_MISMATCH')
 ||decode(max(                   PX_MISMATCH),'Y',                  ' PX_MISMATCH')
 ||decode(max(          MV_STALEOBJ_MISMATCH),'Y',         ' MV_STALEOBJ_MISMATCH')
 ||decode(max(      FLASHBACK_TABLE_MISMATCH),'Y',     ' FLASHBACK_TABLE_MISMATCH')
 ||decode(max(          LITREP_COMP_MISMATCH),'Y',         ' LITREP_COMP_MISMATCH')
--Added in Oracle 11g
 ||decode(max(          PLSQL_DEBUG),'Y',                   ' PLSQL_DEBUG')
 ||decode(max(          LOAD_OPTIMIZER_STATS),'Y',          ' LOAD_OPTIMIZER_STATS')
 ||decode(max(          ACL_MISMATCH),'Y',                  ' ACL_MISMATCH')
 ||decode(max(          FLASHBACK_ARCHIVE_MISMATCH),'Y',    ' FLASHBACK_ARCHIVE_MISMATCH')
 ||decode(max(          LOCK_USER_SCHEMA_FAILED),'Y',       ' LOCK_USER_SCHEMA_FAILED')
 ||decode(max(          REMOTE_MAPPING_MISMATCH),'Y',       ' REMOTE_MAPPING_MISMATCH')
 ||decode(max(          LOAD_RUNTIME_HEAP_FAILED),'Y',      ' LOAD_RUNTIME_HEAP_FAILED')
 ||decode(max(          HASH_MATCH_FAILED),'Y',             ' HASH_MATCH_FAILED')
 ||decode(max(          PURGED_CURSOR),'Y',                 ' PURGED_CURSOR')
 ||decode(max(          BIND_LENGTH_UPGRADEABLE),'Y',       ' BIND_LENGTH_UPGRADEABLE')
 reason
from v$sql_shared_cursor
   where sql_id = '&sql_id'
group by
   sql_id, address
) join v$sqlarea using(address, sql_id)
where version_count>1
order by version_count desc,address;
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4530093713805#26568859366976
select table_name, constraint_name,
    cname1 || nvl2(cname2,','||cname2,null) ||
    nvl2(cname3,','||cname3,null) || nvl2(cname4,','||cname4,null) ||
    nvl2(cname5,','||cname5,null) || nvl2(cname6,','||cname6,null) ||
    nvl2(cname7,','||cname7,null) || nvl2(cname8,','||cname8,null)
           columns
 from ( select b.table_name,
               b.constraint_name,
               max(decode( position, 1, column_name, null )) cname1,
               max(decode( position, 2, column_name, null )) cname2,
               max(decode( position, 3, column_name, null )) cname3,
               max(decode( position, 4, column_name, null )) cname4,
               max(decode( position, 5, column_name, null )) cname5,
               max(decode( position, 6, column_name, null )) cname6,
               max(decode( position, 7, column_name, null )) cname7,
               max(decode( position, 8, column_name, null )) cname8,
               count(*) col_cnt
          from (select substr(table_name,1,30) table_name,
                       substr(constraint_name,1,30) constraint_name,
                       substr(column_name,1,30) column_name,
                       position
                  from user_cons_columns ) a,
               user_constraints b
         where a.constraint_name = b.constraint_name
           and b.constraint_type = 'R'
         group by b.table_name, b.constraint_name
      ) cons
where col_cnt > ALL
        ( select count(*)
            from user_ind_columns i
           where i.table_name = cons.table_name
             and i.column_name in (cname1, cname2, cname3, cname4,
                                   cname5, cname6, cname7, cname8 )
             and i.column_position <= cons.col_cnt
           group by i.index_name
        );
http://tkyte.blogspot.com/2009/10/httpasktomoraclecomtkyteunindex.html#c3494935918525451523
SELECT decode(b.table_name, NULL, '****', 'ok') status, a.table_name, a.columns fk_columns, b.columns index_columns
FROM (SELECT a.table_name,
a.constraint_name,
LISTAGG(a.column_name, ',') within GROUP(ORDER BY a.position) columns
FROM dba_cons_columns a,
dba_constraints b
WHERE a.constraint_name = b.constraint_name
AND b.constraint_type = 'R'
AND a.owner = b.owner
GROUP BY a.table_name, a.constraint_name) a,
(SELECT table_name,
index_name,
LISTAGG(c.column_name, ',') within GROUP(ORDER BY c.column_position) columns
FROM dba_ind_columns c
GROUP BY table_name, index_name) b
WHERE a.table_name = b.table_name(+)
AND b.columns(+) LIKE a.columns || '%'
ORDER BY status, table_name

procedure stats_imp_over_dblink(
-- procedure for the schema/table statistics moving over database link - for example between the production and testing environments
v_dblink2prod      varchar2 := '',                 -- dblink name to source db
v_schema           varchar2 := '',                 -- source/target schema name to synchronize stats
v_tabname          varchar2 := '',                 -- source/target table name to synchronize stats
v_tbl_stattab_prod varchar2 := 'tbl_stattab_prod', -- stattab name (local and remote)
v_gtt4stattab      varchar2 := 'gtt4stattab',      -- GTT name for CLOB moving over dblink (local only)
v_force_stats_imp  boolean := false)               -- to force import despite of schema/table ddl differencies
is
TYPE TblLstCurType IS REF CURSOR;
TblLst_cv                        TblLstCurType;
v_discount                       number              := 0;
r_tblname                        varchar2(30);
stattab_doesnt_exists            exception;
tab_doesnt_exists                exception;
PRAGMA EXCEPTION_INIT(stattab_doesnt_exists, -20002);
PRAGMA EXCEPTION_INIT(tab_doesnt_exists, -942);
begin
if v_dblink2prod is null then dbms_output.put_line('V_DBLINK2PROD var have to be specified!!!'); return; end if;
if v_schema is null then dbms_output.put_line('V_SCHEMA var have to be specified!!!'); return; end if;

if v_tabname is not null then
execute immediate 'select count(*) from
((select table_name, column_name, data_type, data_length from dba_tab_cols@'||v_dblink2prod||' where owner = '''||upper(v_schema)||''' and table_name = '''||upper(v_tabname)||'''
minus
select table_name, column_name, data_type, data_length from dba_tab_cols where owner = '''||upper(v_schema)||''' and table_name = '''||upper(v_tabname)||''')
union all
select table_name, column_name, descend, column_length from
(select table_owner, table_name, column_name, column_position, column_length, char_length, descend
from dba_ind_columns@'||v_dblink2prod||' where table_owner = '''||upper(v_schema)||''' and table_name = '''||upper(v_tabname)||'''
minus
select table_owner, table_name, column_name, column_position, column_length, char_length, descend
from dba_ind_columns where table_owner = '''||upper(v_schema)||''' and table_name = '''||upper(v_tabname)||'''))'
into v_discount;
if v_discount > 0 and not v_force_stats_imp then dbms_output.put_line('Table '||upper(v_tabname)||' DDL''s are different in local and remote schrmas!'); return; end if;
else
execute immediate 'select count(*) from
((select table_name, column_name, data_type, data_length from dba_tab_cols@'||v_dblink2prod||' where owner = '''||upper(v_schema)||''' and table_name not like ''BIN$%'' and table_name not in (select view_name from dba_views@'||v_dblink2prod||')
minus
select table_name, column_name, data_type, data_length from dba_tab_cols where owner = '''||upper(v_schema)||''' and table_name not like ''BIN$%'' and table_name not in (select view_name from dba_views))
union all
select table_name, column_name, descend, column_length from
(select table_owner, table_name, column_name, column_position, column_length, char_length, descend
from dba_ind_columns@'||v_dblink2prod||' where table_owner = '''||upper(v_schema)||''' and index_name not like ''BIN$%''
minus
select table_owner, table_name, column_name, column_position, column_length, char_length, descend
from dba_ind_columns where table_owner = '''||upper(v_schema)||''' and index_name not like ''BIN$%''))'
into v_discount;
if v_discount > 0 and not v_force_stats_imp then dbms_output.put_line('SCHEMAS have differences, sorry...'); return; end if;
end if;

begin execute immediate 'begin dbms_stats.drop_stat_table@'||v_dblink2prod||'('''||upper(v_schema)||''', '''||upper(v_tbl_stattab_prod)||'''); end;'; exception when stattab_doesnt_exists then null; end;
begin execute immediate 'begin dbms_stats.drop_stat_table('''||upper(v_schema)||''', '''||upper(v_tbl_stattab_prod)||'''); end;'; exception when stattab_doesnt_exists then null; end;
execute immediate 'begin dbms_stats.create_stat_table@'||v_dblink2prod||'('''||upper(v_schema)||''', '''||upper(v_tbl_stattab_prod)||'''); end;';
execute immediate 'begin dbms_stats.create_stat_table('''||upper(v_schema)||''', '''||upper(v_tbl_stattab_prod)||'''); end;';
begin execute immediate 'drop table '||v_gtt4stattab; exception when tab_doesnt_exists then null; end;
execute immediate 'create global temporary table '||v_gtt4stattab||' on commit delete rows as select * from "'||upper(v_schema)||'"."'||upper(v_tbl_stattab_prod)||'"@'||v_dblink2prod||' where 1=0';

if v_tabname is not null
then execute immediate 'begin dbms_stats.export_table_stats@'||v_dblink2prod||'(ownname => '''||upper(v_schema)||''', tabname => '''||upper(v_tabname)||''', stattab => '''||upper(v_tbl_stattab_prod)||'''); end;';
else
if v_discount = 0
then execute immediate 'begin dbms_stats.export_schema_stats@'||v_dblink2prod||'(ownname => '''||upper(v_schema)||''', stattab => '''||upper(v_tbl_stattab_prod)||'''); end;';
else
OPEN TblLst_cv FOR
'select table_name from dba_tables@'||v_dblink2prod||' where owner = '''||upper(v_schema)||''' and table_name not like ''BIN$%'' and table_name not in (select view_name from dba_views@'||v_dblink2prod||')
minus
select distinct table_name from
((select table_name, column_name, data_type, data_length from dba_tab_cols@'||v_dblink2prod||' where owner = '''||upper(v_schema)||''' and table_name not like ''BIN$%''
minus
select table_name, column_name, data_type, data_length from dba_tab_cols where owner = '''||upper(v_schema)||''' and table_name not like ''BIN$%'')
union all
select table_name, column_name, descend, column_length from
(select * from dba_ind_columns@'||v_dblink2prod||' where table_owner = '''||upper(v_schema)||''' and index_name not like ''BIN$%''
minus
select * from dba_ind_columns where table_owner = '''||upper(v_schema)||''' and index_name not like ''BIN$%''))';
LOOP
FETCH TblLst_cv INTO r_tblname;
EXIT WHEN TblLst_cv%NOTFOUND;
execute immediate 'begin dbms_stats.export_table_stats@'||v_dblink2prod||'(ownname => '''||upper(v_schema)||''', tabname => '''||r_tblname||''', stattab => '''||upper(v_tbl_stattab_prod)||'''); end;';
END LOOP;
end if;
end if;

execute immediate 'insert into '||v_gtt4stattab||' select * from "'||upper(v_schema)||'"."'||upper(v_tbl_stattab_prod)||'"@'||v_dblink2prod;
execute immediate 'insert/*+ APPEND*/ into "'||upper(v_schema)||'"."'||upper(v_tbl_stattab_prod)||'" select * from '||v_gtt4stattab;
commit;

if v_tabname is null
then execute immediate 'begin dbms_stats.import_schema_stats(ownname => '''||upper(v_schema)||''', stattab => '''||upper(v_tbl_stattab_prod)||'''); end;';
else execute immediate 'begin dbms_stats.import_table_stats(ownname => '''||upper(v_schema)||''', tabname => '''||upper(v_tabname)||''', stattab => '''||upper(v_tbl_stattab_prod)||'''); end;';
end if;
end stats_imp_over_dblink;

select --+ rule
   lpad('  ', 2 * level) ||
   (select object_type || ' ' || owner || '.' || object_name
    from dba_objects
    where object_id = pd.object_id) || '  <=  ' ||
   (select object_type || ' ' || owner || '.' || object_name
    from dba_objects
    where object_id = pd.referenced_object_id)
from public_dependency pd
connect by prior referenced_object_id = object_id
start with object_id in
   (select object_id
    from dba_objects
    where (owner, object_name) in
       (select distinct object_owner, object_name
        from v$sql_plan
        where sql_id = '&SQL_ID'
        and object_owner is not null
        and object_name is not null));

-- Dependent (from "OWNER"."OBJECT_NAME") objects tree
select --+ rule
      lpad('      ', 2 * level) ||
      (select object_type || ' ' || owner || '.' || object_name
             from dba_objects where object_id = pd.referenced_object_id) ||
      '      >_is_referenced_by_>      ' ||
      (select object_type || ' ' || owner || '.' || object_name
             from dba_objects where object_id = pd.object_id)
from public_dependency pd
     connect by prior object_id = referenced_object_id
     start with referenced_object_id in
          (select object_id
           from dba_objects where (owner, object_name) in (('&OWNER', '&OBJECT_NAME')));

crs_stat с нормальным, необрезанным выводом – взято отсюда

$ crs_stat | awk -F= '/NAME=/{n=$2}/TYPE=/{t=$2}/TARGET=/{g=$2}/STATE=/{s=$2; printf("%-30s%-30s%-10s%-30s\n", n,t,g,s)}'
ora.DATA.dg                   ora.diskgroup.type            ONLINE    ONLINE on oracle-host01
ora.LISTENER.lsnr             ora.listener.type             ONLINE    ONLINE on oracle-host01
ora.asm                       ora.asm.type                  ONLINE    ONLINE on oracle-host01
ora.cssd                      ora.cssd.type                 ONLINE    ONLINE on oracle-host01
ora.diskmon                   ora.diskmon.type              ONLINE    ONLINE on oracle-host01
ora.evmd                      ora.evm.type                  ONLINE    ONLINE on oracle-host01
ora.ons                       ora.ons.type                  ONLINE    ONLINE on oracle-host01
ora.orc11202.db               ora.database.type             ONLINE    ONLINE on oracle-host01

sqltext_to_sqlid

Начиная с 11.2.0.1 – http://www.slaviks-blog.com/2010/03/30/oracle-sql_id-and-hash-value/:

select dbms_sqltune_util0.sqltext_to_sqlid('select sysdate from dual'||chr(0)) sql_id from dual;

 

SQL> select dbms_sqltune_util0.sqltext_to_sqlid(sql_fulltext||chr(0)) sql_id from dual, gv$sql where sql_id =  'a7xju9dz0abdx'
2  /

SQL_ID
-------------
a7xju9dz0abdx

Начиная с 10.2

CREATE OR REPLACE FUNCTION sqltext_to_sqlid(p_sql IN VARCHAR2)
RETURN VARCHAR2
IS
-- Author: Sean Stuber
-- based on algorithm described by Tanel Poder here
-- http://blog.tanelpoder.com/2009/02/22/sql_id-is-just-a-fancy-representation-of-hash-value/
-- Generate md5 hash of the sql text
-- Oracle appends a null-char (0) before hashing
v_md5 RAW(16) := DBMS_CRYPTO.hash(UTL_I18N.string_to_raw(p_sql || CHR(0), 'AL32UTF8'), DBMS_CRYPTO.hash_md5);
-- pull the last 64bits from the md5
-- reverse each of the 32bit words to fix endianness
-- convert the 16 digit hex string to a number
v_temp NUMBER := TO_NUMBER( RAWTOHEX(UTL_RAW.reverse(UTL_RAW.SUBSTR(v_md5, 9, 4)))
|| RAWTOHEX(UTL_RAW.reverse(UTL_RAW.SUBSTR(v_md5, 13, 4))), RPAD('x', 16, 'x'));
v_sqlid VARCHAR2(13);
BEGIN
-- Convert number to base32 string
-- use alphabet defined in Tanel Poder’s sqlid to hash query
FOR i IN 0 .. FLOOR(LN(v_temp) / LN(32))
   LOOP
   v_sqlid := SUBSTR('0123456789abcdfghjkmnpqrstuvwxyz',FLOOR(MOD(v_temp / POWER(32, i), 32)) + 1, 1) || v_sqlid;
END LOOP;
RETURN LPAD(v_sqlid, 13, '0');
END;
/

select sqltext_to_sqlid('select sysdate from dual') from dual;

Актуальные блоки бд, занятые строками сегмента таблицы/матвьюшки (в отсутствии chained rows)

with rowid_blocks as
     (select /*+ materialize*/
      dbms_rowid.rowid_relative_fno(rowid) relative_fno,
      dbms_rowid.rowid_block_number(rowid) block_number
      from "&&1"."&&2")
 select relative_fno,
        count(distinct block_number) used_blocks,
        count(block_number) used_rows
 from rowid_blocks
 group by rollup(relative_fno)
 /

Подсказки из V$SQL_PLAN outline section

select substr(extractvalue(value(d), '/hint'), 1, 200) as outline_hints
  from xmltable('/*/outline_data/hint' passing
                (select xmltype(other_xml) as xmlval
                   from v$sql_plan
                  where sql_id = '&sql_id'
                    and child_number = &child_number
                  --and plan_hash_value = &plan_hash_value
                    and other_xml is not null)) d
/

Подсказки из SQL PLAN BASELINE

select substr(extractvalue(value(d), '/hint'), 1, 200) as outline_hints
  from xmltable('/outline_data/hint' passing
                (select xmltype(comp_data) as xmlval
                   from sys.sqlobj$data od, sys.sqlobj$ o
                  where o.obj_type = 2
                    and o.name = '&SQL_PLAN_BASELINE'
                    and o.signature = od.signature
                    and o.plan_id = od.plan_id
                    and comp_data is not null)) d
/

Удаление курсора из shared pool по sql_id

declare
  v_address_hash varchar2(60);
begin
  select address || ', ' || hash_value
    into v_address_hash
    from v$sqlarea
   where sql_id = '&sql_id';
  sys.dbms_shared_pool.purge(v_address_hash, 'c');
end;
/

ORA-30036: кто съел UNDO?

SQL> SELECT b.start_time, a.inst_id, a.sid, a.username, a.program, b.used_urec, b.used_ublk
2    FROM gv$session a, gv$transaction b
3   WHERE a.saddr = b.ses_addr
4     and a.inst_id = b.inst_id
5   ORDER BY b.used_ublk DESC
6  /

START_TIME        INST_ID  SID USERNAME PROGRAM                              USED_UREC  USED_UBLK
----------------- ------- ---- -------- ----------------------------------- ---------- ----------
03/01/12 15:51:46       1   19 APPS     frmweb@appl1.oebs.net (TNS V1-V3)         9048        130
03/01/12 15:54:16       2   16 APPS     STANDARD@appl1.oebs.net (TNS V1-V3)       2389         58
...

SQL> select inst_id, sid, name, value
2    from gv$sesstat s, v$statname n
3   where s.statistic# = n.statistic#
4     and name = 'undo change vector size'
5   order by value desc
6  /

INST_ID SID NAME                        VALUE
------- --- ----------------------- ---------
1       925 undo change vector size 388021008 -- bytes
...

Peeked Binds from V$SQL_PLAN/DBA_HIST_SQL_PLAN.OTHER_XML

select sql_id,
       child_number,
       plan_hash_value,
       EXTRACTVALUE(VALUE(D), '/bind/@nam') as NAME,
       to_number(EXTRACTVALUE(VALUE(D), '/bind/@pos')) as POSITION,
       EXTRACTVALUE(VALUE(D), '/bind/@ppo') as PPO,
       EXTRACTVALUE(VALUE(D), '/bind/@dty') as DATATYPE,
       EXTRACTVALUE(VALUE(D), '/bind/@csi') as CSI,
       EXTRACTVALUE(VALUE(D), '/bind/@frm') as FRM,
       EXTRACTVALUE(VALUE(D), '/bind/@pre') as PRE,
       EXTRACTVALUE(VALUE(D), '/bind/@scl') as SCL,
       EXTRACTVALUE(VALUE(D), '/bind/@mxl') as MAXLENGTH,
       EXTRACTVALUE(VALUE(D), '/bind/@captured') as CAPTURED,
       EXTRACTVALUE(VALUE(D), '/bind') as VALUE,
       system.display_raw(EXTRACTVALUE(VALUE(D), '/bind'), -- DISPLAY_RAW function from Greg Rahn http://structureddata.org/2007/10/16/how-to-display-high_valuelow_value-columns-from-user_tab_col_statistics/
                          decode(EXTRACTVALUE(VALUE(D), '/bind/@dty'),
                                 1,'VARCHAR2',
                                 2,'NUMBER',
                                 12,'DATE',
                                 21,'BINARY_FLOAT',
                                 22,'BINARY_DOUBLE',
                                 69,'ROWID',
                                 96,'CHAR'))
  FROM gv$sql_plan,
       TABLE(XMLSEQUENCE(EXTRACT(xmltype(other_xml), '/*/peeked_binds/bind'))) D
 where sql_id = '&sqlid'
   and other_xml is not null
 order by child_number, POSITION

ИНФО из V$SQL_PLAN/DBA_HIST_SQL_PLAN.OTHER_XML

SELECT /*+ opt_param('parallel_execution_enabled', 'false') */
      extractvalue(xmlval, '/*/info[@type = "db_version"]')                       as DB_VERSION,
      xmlcast(extract(xmlval, '/*/info[@type="load_type"]') as varchar2(200))     as LOAD_TYPES,
      extractvalue(xmlval, '/*/info[@type = "dop_reason"]')                       as DOP_REASON,
      extractvalue(xmlval, '/*/info[@type = "dop"]')                              as DOP,
      extractvalue(xmlval, '/*/info[@type = "px_in_memory"]')                     as PX_IN_MEMORY,
      extractvalue(xmlval, '/*/info[@type = "sql_profile"]')                      as SQL_PROFILE,
      extractvalue(xmlval, '/*/info[@type = "sql_patch"]')                        as SQL_PATCH,
      extractvalue(xmlval, '/*/info[@type = "baseline"]')                         as BASELINE,
      extractvalue(xmlval, '/*/info[@type = "outline"]')                          as OUTLINE,
      extractvalue(xmlval, '/*/info[@type = "dynamic_sampling"]')                 as DYNAMIC_SAMPLING,
      extractvalue(xmlval, '/*/info[@type = "dop"]')                              as DOP,
      extractvalue(xmlval, '/*/info[@type = "row_shipping"]')                     as ROW_SHIPPING,
      extractvalue(xmlval, '/*/info[@type = "index_size"]')                       as INDEX_SIZE,
      extractvalue(xmlval, '/*/info[@type = "result_checksum"]')                  as RESULT_CHECKSUM,
      extractvalue(xmlval, '/*/info[@type = "cardinality_feedback"]')             as CARDINALITY_FEEDBACK,
      extractvalue(xmlval, '/*/info[@type = "plan_hash"]')                        as PLAN_HASH,
      extractvalue(xmlval, '/*/info[@type = "plan_hash_2"]')                      as PLAN_HASH_2
from
   (select xmltype(other_xml) xmlval from dba_hist_sql_plan where sql_id = '&sql_id' and other_xml is not null)

Предикаты, добавляемые VPD | RLS | FGAC для sql_id

SELECT sql_id,
       object_owner,
       object_name,
       policy_group,
       policy,
       policy_function_owner,
       predicate
FROM gv$vpd_policy
 where sql_id = '&sql_id'

URI для обратной ссылки

Тема: Rubric. Блог на WordPress.com.

Follow

Get every new post delivered to your Inbox.