Extracting a Bind variable from v$sql. If there is more than one child cursor then the script needs to be modified to reflect that.
declare
b1 varchar2(1000);
b2 sys.sql_bind;
pos number := 1;
begin
select bind_data into b1 from v$sql where sql_id = '&sql_id';
loop
select dbms_sqltune.extract_bind(b1,pos) into b2 from dual;
exit when b2 is null;
dbms_output.put_line(pos || ':' || anydata.accesstimestamp(b2.VALUE_ANYDATA) || ':' || b2.value_string);
pos := pos + 1;
end loop;
end;
/
Mining redo logs:
exec dbms_logmnr.add_logfile('<log file>');
exec dbms_logmnr.add_logfile('<log file>');
exec DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
Viewing bind variables that a timestamps in v$sql_bind_capture
SELECT anydata.accesstimestamp(value_anydata) FROM v$sql_bind_capture WHERE sql_id='&your_sql_id'
Generating a SQL_MONITOR like report from ASH data. For performance reasons, you need to know the being and end snapshots from the AWR.
col oper format a45
col sample_time format a30
select /*+ index(h WRH$_ACTIVE_SESSION_HISTORY_PK) */
p.id, lpad(' ',p.DEPTH) || p.OPERATION || ' ' || p.OPTIONS oper, p.OBJECT_NAME,
sum(case when h.sql_plan_line_id = p.id then 1 else 0 end) cnt
from sys.WRH$_ACTIVE_SESSION_HISTORY h
right outer join sys.WRH$_SQL_PLAN p
on h.dbid = p.dbid
and h.sql_id = p.sql_id
and h.sql_plan_hash_value = p.plan_hash_value
where h.sql_id = '&sql_id'
and h.dbid = ( select dbid from v$database )
and h.snap_id between &begin_snap_id and &end_snap_id
group by p.id, lpad(' ',p.DEPTH) || p.OPERATION || ' ' || p.OPTIONS, p.OBJECT_NAME
order by 1
/
Flush a single cursor from the shared pool. You need to be SYSDBA to do this and then run the output SQL.
select distinct 'exec dbms_shared_pool.purge(''' || address || ', ' || hash_value || ''',''C'');' "Run this command"
from v$sql where sql_id = '&SQL_ID';
Exporting a plan from one database and into another. Note that you need to get the plan name from after the first PL/SQL is executed so that you can use it in the third.
set serveroutput on
declare
plans_loaded pls_integer;
begin
plans_loaded := sys.dbms_spm.load_plans_from_cursor_cache('&SQL_ID');
sys.dbms_output.put_line('Plans Loaded for good_id : '||plans_loaded);
end;
/
BEGIN
DBMS_SPM.CREATE_STGTAB_BASELINE(table_name => '&&staging_table_name');
END;
/
DECLARE
my_plans number;
BEGIN
my_plans := DBMS_SPM.PACK_STGTAB_BASELINE(
table_name => '&&staging_table_name',
PLAN_NAME=>'&sql_plan_name');
end;
/
# Export and then import to new database
DECLARE
my_plans number;
BEGIN
my_plans := DBMS_SPM.UNPACK_STGTAB_BASELINE(
table_name => '&staging_table_name');
END;
/
Create a SQL Tuning set with all plans used in a given time period. This can be useful for generating reference sets when making significant changes such as upgrades.
exec dbms_sqltune.create_sqlset(sqlset_name => '&&set_name',description=>'&description'); exec DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET (sqlset_name=> '&&set_name', time_limit=>&time_in_seconds);
Sessions holding library cache locks on a specific object. This was rather useful in the past as it showed a bug in Oracle:
select s.sid,
s.serial#,
count(*)
from v$libcache_locks l
join v$session s
on l.holding_user_session = s.saddr
where object_handle = (select * from sys.x$kglob where kglnaobj = '&object_name';)
group by s.sid, s.serial#;
Enabling and disabling tracing for a single SQL statement. Note that the only time I have actually seen any performance impact from enabling tracing was when I used it with binds on a SQL statement that did very little but had a large number of binds.
alter system set events 'sql_trace [sql:2n4upggzfrv66] wait=true, bind=false,plan_stat=all_executions,level=8'; alter system set events 'sql_trace [sql:2n4upggzfrv66] off';
Extracting the hints from a baseline:
SELECT extractValue(value(h),'.') AS hint FROM sys.sqlobj$plan od, TABLE(xmlsequence( extract(xmltype(od.other_xml),'/*/outline_data/hint'))) h WHERE od.other_xml is not null AND (signature,category,obj_type,plan_id) = (select signature, category, obj_type, plan_id from sys.sqlobj$ so where so.name = '&sql_plan_name');
Extracting the hints from a SQL Patch:
select cast(extractvalue(value(x), '/hint') as varchar2(500)) as outline_hints
from xmltable('/outline_data/hint'
passing (select xmltype(comp_data) xml
from sys.sqlobj$data
where signature = ( select signature from dba_sql_patches where name = '&patch_name' )
and obj_type = 3)) x;
Disabling direct path reads.
alter session set events '10949 trace name context forever, level 1';