BMC Oracle: Difference between revisions

From Braindump
Jump to navigation Jump to search
No edit summary
No edit summary
 
Line 21: Line 21:
  WHERE num_rows > 0
  WHERE num_rows > 0
  ORDER BY MB DESC;
  ORDER BY MB DESC;
 
  SELECT s.segment_name, s.blocks, s.bytes, s.segment_type, ars.viewname
  SELECT s.segment_name, s.blocks, s.bytes, s.segment_type, ars.viewname
  FROM user_segments s
  FROM user_segments s
Line 27: Line 27:
  ON to_char(ars.schemaid) = LTRIM(s.segment_name, 'THB')
  ON to_char(ars.schemaid) = LTRIM(s.segment_name, 'THB')
  ORDER BY bytes DESC;
  ORDER BY bytes DESC;
 
EXCEL
EXCEL
  =VLOOKUP(VALUE(RIGHT(B2; LEN(B2)-1));ARSCHEMA!$A$1:$B$4000;2;FALSE)
  =VLOOKUP(VALUE(RIGHT(B2; LEN(B2)-1));ARSCHEMA!$A$1:$B$4000;2;FALSE)
  [<999999]#,##0." KB ";[<999999999]#,##0.." MB";#,##0..." GB"
  [<999999]#,##0." KB ";[<999999999]#,##0.." MB";#,##0..." GB"
 
  SELECT s.segment_name, s.blocks, s.bytes, s.segment_type,
  SELECT s.segment_name, s.blocks, s.bytes, s.segment_type,
  CASE s.segment_type
  CASE s.segment_type
Line 76: Line 72:
  FROM user_segments s
  FROM user_segments s
  ORDER BY bytes DESC;
  ORDER BY bytes DESC;
 
=== BMC Tables ===
=== BMC Tables
  -- arschema
  -- arschema
  SELECT VIEWNAME FROM ARSCHEMA WHERE SCHEMAID='1397';
  SELECT VIEWNAME FROM ARSCHEMA WHERE SCHEMAID='1397';
Line 93: Line 84:
   
   
  select status from user_indexes where status = 'UNUSABLE';
  select status from user_indexes where status = 'UNUSABLE';
 
=== TABLE SPACE ===
=== TABLE SPACE ===
 
  -- ASM Data files
  -- ASM Data files
  SELECT FILE_NAME, BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'ARSYS';
  SELECT FILE_NAME, BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'ARSYS';
Line 107: Line 98:
  ALTER TABLE T1100 MOVE TABLESPACE HOTZONE
  ALTER TABLE T1100 MOVE TABLESPACE HOTZONE
  ALTER INDEX I1100_179_1 REBUILD
  ALTER INDEX I1100_179_1 REBUILD
 
  -- All tables, views, indexes
  -- All tables, views, indexes
  SELECT OBJECT_NAME,OBJECT_TYPE,OWNER FROM all_objects WHERE owner = 'ARADMIN' AND OBJECT_TYPE IN ('TABLE','VIEW','INDEX')
  SELECT OBJECT_NAME,OBJECT_TYPE,OWNER FROM all_objects WHERE owner = 'ARADMIN' AND OBJECT_TYPE IN ('TABLE','VIEW','INDEX')
 
  -- Invalid Views
  -- Invalid Views
  SELECT 'ALTER VIEW ' || object_name || ' COMPILE;' FROM all_objects WHERE owner = 'ARADMIN' AND object_type IN ('VIEW') AND status = 'INVALID'
  SELECT 'ALTER VIEW ' || object_name || ' COMPILE;' FROM all_objects WHERE owner = 'ARADMIN' AND object_type IN ('VIEW') AND status = 'INVALID'
  ALTER VIEW AR_SYSTEM_EMAIL_MESSAGES COMPILE;
  ALTER VIEW AR_SYSTEM_EMAIL_MESSAGES COMPILE;
 
  -- Shrink Table
  -- Shrink Table
  alter table T223 enable row movement;
  alter table T223 enable row movement;
Line 120: Line 111:
  alter table T223 disable row movement;
  alter table T223 disable row movement;
  ALTER INDEX I223_% REBUILD NOLOGGING
  ALTER INDEX I223_% REBUILD NOLOGGING
 
=== Size ===
=== Size ===
  SELECT TABLE_NAME, NUM_ROWS FROM TABS WHERE NUM_ROWS > 0 ORDER BY NUM_ROWS DESC;
  SELECT TABLE_NAME, NUM_ROWS FROM TABS WHERE NUM_ROWS > 0 ORDER BY NUM_ROWS DESC;
   
   
Line 143: Line 134:
   
   
   
   
=== INDEXES ===
=== INDEXES ===
   
   
  INDEXES help oracle to find data in a WHERE clause quickly, they do need to be maintained in UPDATE/DELETE statements
  INDEXES help oracle to find data in a WHERE clause quickly, they do need to be maintained in UPDATE/DELETE statements
Line 149: Line 140:
  SELECT T1157.C1 FROM T1157 WHERE (T1157.C10000901 IS NULL) ORDER BY C1;
  SELECT T1157.C1 FROM T1157 WHERE (T1157.C10000901 IS NULL) ORDER BY C1;
  CREATE INDEX I1146_179_2 ON aradmin.T1146 (C179,C1);
  CREATE INDEX I1146_179_2 ON aradmin.T1146 (C179,C1);
   
   
  -- Index Size
  -- Index Size
Line 175: Line 165:
   
   
  select table_name, num_rows, blocks "Ever Used", empty_blocks "Never Used", num_rows "Total rows",round((blocks*8),2)||'kb' "used size", round((num_rows*avg_row_len/1024),2)||'kb' "max size" from user_tables where table_name = 'T1148';
  select table_name, num_rows, blocks "Ever Used", empty_blocks "Never Used", num_rows "Total rows",round((blocks*8),2)||'kb' "used size", round((num_rows*avg_row_len/1024),2)||'kb' "max size" from user_tables where table_name = 'T1148';
   
   
  -- Index Monitoring
  -- Index Monitoring
Line 187: Line 176:
   
   
  SELECT index_name,table_name,uniqueness,blevel,degree,num_rows,status from user_indexes where index_name IN (SELECT index_name FROM v$object_usage WHERE used = 'NO')
  SELECT index_name,table_name,uniqueness,blevel,degree,num_rows,status from user_indexes where index_name IN (SELECT index_name FROM v$object_usage WHERE used = 'NO')
 
  -- EXPLAIN PLAN
  -- EXPLAIN PLAN
  SELECT DISTINCT(SQL_ID) FROM V$SQL_PLAN WHERE ORDER BY cpu_cost DESC
  SELECT DISTINCT(SQL_ID) FROM V$SQL_PLAN WHERE ORDER BY cpu_cost DESC
  SELECT distinct(sql_id), count(sql_id) amount, io_cost FROM V$SQL_PLAN WHERE OPERATION = 'TABLE ACCESS' AND OPTIONS = 'FULL' GROUP BY sql_id, io_cost ORDER BY (io_cost * amount)  DESC NULLS LAST
  SELECT distinct(sql_id), count(sql_id) amount, io_cost FROM V$SQL_PLAN WHERE OPERATION = 'TABLE ACCESS' AND OPTIONS = 'FULL' GROUP BY sql_id, io_cost ORDER BY (io_cost * amount)  DESC NULLS LAST
 
  -- blocking sessions
  -- blocking sessions
  SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait FROM v$session WHERE blocking_session is not NULL order by blocking_session;
  SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait FROM v$session WHERE blocking_session is not NULL order by blocking_session;
Line 199: Line 186:
  SELECT sid, sql_text FROM v$session s, v$sql q WHERE sid in
  SELECT sid, sql_text FROM v$session s, v$sql q WHERE sid in
     (SELECT sid FROM v$session WHERE state in ('WAITING') and wait_class != 'Idle' and event='enq: TX - row lock contention' AND (q.sql_id = s.sql_id or q.sql_id = s.prev_sql_id));
     (SELECT sid FROM v$session WHERE state in ('WAITING') and wait_class != 'Idle' and event='enq: TX - row lock contention' AND (q.sql_id = s.sql_id or q.sql_id = s.prev_sql_id));
  --history of sessions that block other sessions
  --history of sessions that block other sessions
  select * from (
  select * from (
Line 213: Line 199:
  and a.user_id <> 0
  and a.user_id <> 0
  ) where rn = 1
  ) where rn = 1
 
 
  SELECT username U_NAME, owner OBJ_OWNER,
  SELECT username U_NAME, owner OBJ_OWNER,
Line 236: Line 221:
  AND v.session_id = s.sid
  AND v.session_id = s.sid
  ORDER BY username, session_id;
  ORDER BY username, session_id;
 
  -- Full Table Scans
  -- Full Table Scans
  SELECT
  SELECT
Line 257: Line 241:
  order by
  order by
     s.blocks desc, sum(a.executions) desc;
     s.blocks desc, sum(a.executions) desc;
 
  -- activity per session
  -- activity per session
  SELECT a.SID, a.status, a.last_call_et, A.SID, A.username, C.piece, c.sql_text sqltext FROM v$session a, v$sqltext c WHERE a.sql_address = c.address(+);
  SELECT a.SID, a.status, a.last_call_et, A.SID, A.username, C.piece, c.sql_text sqltext FROM v$session a, v$sqltext c WHERE a.sql_address = c.address(+);
   
   
=== OPEN CURSORS ===
 
=== OPEN CURSORS ===
  -- open cursor
  -- open cursor
  select max(a.value) as highest_open_cur, p.value as max_open_cur from v$sesstat a, v$statname b, v$parameter p where a.statistic# = b.statistic# and b.name = 'opened cursors current' and p.name= 'open_cursors' group by p.value;
  select max(a.value) as highest_open_cur, p.value as max_open_cur from v$sesstat a, v$statname b, v$parameter p where a.statistic# = b.statistic# and b.name = 'opened cursors current' and p.name= 'open_cursors' group by p.value;
Line 273: Line 253:
  select a.value, s.username, s.sid, s.serial# from v$sesstat a, v$statname b, v$session s where a.statistic# = b.statistic# and s.sid=a.sid and b.name = 'opened cursors current' AND s.username = 'LPORTAL';
  select a.value, s.username, s.sid, s.serial# from v$sesstat a, v$statname b, v$session s where a.statistic# = b.statistic# and s.sid=a.sid and b.name = 'opened cursors current' AND s.username = 'LPORTAL';
   
   
=== What keeps the database busy? ===
=== What keeps the database busy? ===
  -- execution time v.s. disk io
  -- execution time v.s. disk io
  SELECT to_char( to_date( round(ELAPSED_TIME/1000000, 0), 'sssss'), 'hh24:mi:ss') as TIME,
  SELECT to_char( to_date( round(ELAPSED_TIME/1000000, 0), 'sssss'), 'hh24:mi:ss') as TIME,
Line 291: Line 270:
   GROUP BY ELAPSED_TIME, SQL_ID, Executions, DISK_READS, DIRECT_WRITES, LAST_ACTIVE_TIME, BUFFER_GETS, CPU_TIME, sql_text
   GROUP BY ELAPSED_TIME, SQL_ID, Executions, DISK_READS, DIRECT_WRITES, LAST_ACTIVE_TIME, BUFFER_GETS, CPU_TIME, sql_text
  ORDER BY 9 DESC
  ORDER BY 9 DESC
 
  SELECT SQL_ID, SQL_TEXT, Executions, BUFFER_GETS, DISK_READS, DIRECT_WRITES, to_char(LAST_ACTIVE_TIME, 'YYYY-MON-DD-HH24:MI:SS'), CPU_TIME FROM v$sql
  SELECT SQL_ID, SQL_TEXT, Executions, BUFFER_GETS, DISK_READS, DIRECT_WRITES, to_char(LAST_ACTIVE_TIME, 'YYYY-MON-DD-HH24:MI:SS'), CPU_TIME FROM v$sql
  SELECT MIN(LAST_ACTIVE_TIME) FROM v$sql
  SELECT MIN(LAST_ACTIVE_TIME) FROM v$sql
  SELECT SQL_TEXT FROM v$sql WHERE LAST_ACTIVE_TIME < '28-MAY-14'
  SELECT SQL_TEXT FROM v$sql WHERE LAST_ACTIVE_TIME < '28-MAY-14'
 
  -- find SQL by ID
  -- find SQL by ID
  SELECT SQL_TEXT FROM V$SQL WHERE SQL_ID = '7pf3kz41synpu';
  SELECT SQL_TEXT FROM V$SQL WHERE SQL_ID = '7pf3kz41synpu';
 
  -- bind value
  -- bind value
  select child_address, name, value_string FROM v$sql_bind_capture WHERE sql_id='44v0t18cz509t'
  select child_address, name, value_string FROM v$sql_bind_capture WHERE sql_id='44v0t18cz509t'
 
  -- Find entries that were last updated more than 13 months ago.
  -- Find entries that were last updated more than 13 months ago.
  DELETE FROM T2354 WHERE C6 < (sysdate - to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') - 396)*86400
  DELETE FROM T2354 WHERE C6 < (sysdate - to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') - 396)*86400
  DELETE FROM T1148 WHERE C6 < (sysdate - to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') - 396)*86400
  DELETE FROM T1148 WHERE C6 < (sysdate - to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') - 396)*86400
 
=== Deadlocks ===
=== Deadlocks ===
  SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait FROM v$session WHERE sid = 229
  SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait FROM v$session WHERE sid = 229
   
   
Line 326: Line 300:
   
   
  alter system kill session '229,2159' immediate;
  alter system kill session '229,2159' immediate;
 
  -- Major Cleanup
  -- Major Cleanup
  SELECT COUNT(C6) FROM T1397 WHERE C6 < (sysdate - to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') - 396)*86400;
  SELECT COUNT(C6) FROM T1397 WHERE C6 < (sysdate - to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') - 396)*86400;
Line 338: Line 311:
   
   
  EXEC DBMS_STATS.GATHER_TABLE_STATS ('ARADMIN', 'T1397');
  EXEC DBMS_STATS.GATHER_TABLE_STATS ('ARADMIN', 'T1397');
 
  --
  --
  EXEC DBMS_STATS.gather_table_stats('SMAPP', 'SIM');
  EXEC DBMS_STATS.gather_table_stats('SMAPP', 'SIM');
Line 347: Line 319:
  EXEC DBMS_STATS.GATHER_TABLE_STATS ('DWH', 'DS_PARTB');
  EXEC DBMS_STATS.GATHER_TABLE_STATS ('DWH', 'DS_PARTB');
  EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'DWH', cascade=>TRUE);
  EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'DWH', cascade=>TRUE);
 
  -- AWR  
  -- AWR  
  SELECT snap_id,
  SELECT snap_id,
Line 357: Line 328:
  WHERE begin_interval_time like '25-SEP-14%'
  WHERE begin_interval_time like '25-SEP-14%'
  ORDER BY begin_interval_time;
  ORDER BY begin_interval_time;
 
  70594
  70594
  70630
  70630
  instance: 1
  instance: 1
  db: 3096395807
  db: 3096395807
 
  @awrrpt.sql
  @awrrpt.sql
  /u01/app/oracle/product/11.1/db/rdbms/admin
  /u01/app/oracle/product/11.1/db/rdbms/admin

Latest revision as of 07:44, 10 December 2024

Performance tuning of an BMC using Oracle 11 database

1. archive auditlogs

2. identify tables with high number of rows

3. identify high insert/delete tables

  - clean up
  - drop indexes

4. shrink tables

5. rebuilding indexes

6. change lob to inline

-- Size in MB and num_rows
SELECT alt.table_name, ars.viewname, alt.num_rows, round((alt.num_rows*alt.avg_row_len)/(1024*1024)) MB, alt.LAST_ANALYZED
FROM all_tables alt
LEFT JOIN ARSCHEMA ars
ON to_char(ars.schemaid) = LTRIM(alt.table_name, 'THB')
WHERE num_rows > 0
ORDER BY MB DESC;
SELECT s.segment_name, s.blocks, s.bytes, s.segment_type, ars.viewname
FROM user_segments s
LEFT JOIN ARSCHEMA ars
ON to_char(ars.schemaid) = LTRIM(s.segment_name, 'THB')
ORDER BY bytes DESC;

EXCEL

=VLOOKUP(VALUE(RIGHT(B2; LEN(B2)-1));ARSCHEMA!$A$1:$B$4000;2;FALSE)
[<999999]#,##0." KB ";[<999999999]#,##0.." MB";#,##0..." GB"
SELECT s.segment_name, s.blocks, s.bytes, s.segment_type,
CASE s.segment_type
  WHEN 'TABLE' THEN s.segment_name
  WHEN 'INDEX' THEN (SELECT table_name FROM user_indexes WHERE index_name = s.segment_name)
  WHEN 'LOBINDEX' THEN (SELECT table_name FROM user_indexes WHERE index_name = s.segment_name)
  WHEN 'LOBSEGMENT' THEN (SELECT l.table_name FROM user_lobs l WHERE l.segment_name = s.segment_name)
END AS table_name,
CASE s.segment_type
  WHEN 'TABLE' THEN
    CASE SUBSTR(s.segment_name,1,4)
      WHEN 'MLOG' THEN SUBSTR(s.segment_name,7)
      ELSE LTRIM(s.segment_name,'TBH')
    END
  WHEN 'INDEX' THEN LTRIM((SELECT table_name FROM user_indexes WHERE index_name = s.segment_name),'TBH')
  WHEN 'LOBINDEX' THEN LTRIM((SELECT table_name FROM user_indexes WHERE index_name = s.segment_name),'TBH')
  WHEN 'LOBSEGMENT' THEN REGEXP_REPLACE((SELECT LTRIM(l.table_name, 'TBH') FROM user_lobs l WHERE l.segment_name = s.segment_name),'^(\d+)C.*','\1')
  WHEN 'LOBINDEX' THEN null
  ELSE s.segment_type
END AS scid,
CASE s.segment_type
  WHEN 'INDEX' THEN 
    CASE SUBSTR(s.segment_name,1,2)
      WHEN 'IT' THEN '1'
      WHEN 'IB' THEN '1'
      WHEN 'IH' THEN '1'
      ELSE REGEXP_REPLACE(s.segment_name, 'I[0-9]*_([0-9]*)_[0-9]*','\1')
    END
  WHEN 'LOBSEGMENT' THEN (SELECT SUBSTR(l.column_name,2) FROM user_lobs l WHERE l.segment_name = s.segment_name)
  ELSE null
END as columnid,
CASE s.segment_type
  WHEN 'TABLE' THEN (SELECT num_rows FROM user_tables WHERE table_name = s.segment_name)
  WHEN 'INDEX' THEN (SELECT num_rows FROM user_indexes WHERE index_name = s.segment_name)
END AS num_rows,
CASE s.segment_type
  WHEN 'TABLE' THEN (SELECT last_analyzed FROM user_tables WHERE table_name = s.segment_name)
  WHEN 'INDEX' THEN (SELECT last_analyzed FROM user_indexes WHERE index_name = s.segment_name)
END AS last_analyzed
FROM user_segments s
ORDER BY bytes DESC;

BMC Tables

-- arschema
SELECT VIEWNAME FROM ARSCHEMA WHERE SCHEMAID='1397';
SELECT SCHEMAID, VIEWNAME, SCHEMATYPE FROM ARSCHEMA;
SELECT SCHEMAID, VIEWNAME, SCHEMATYPE FROM SCHEMA_INDEX;

SELECT uic.index_name, uic.table_name, uic.column_name, uic.column_position, ui.last_analyzed, ui.uniqueness FROM user_ind_columns uic INNER JOIN user_indexes ui ON uic.index_name = ui.index_name WHERE uic.table_name like 'T%' AND ui.index_name not like 'IT%'
SELECT indexname, schemaid, listindex, numfields, uniqueflag, f1,  f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16 FROM schema_index
SELECT schemaid, name, schematype, numfields, viewname FROM arschema

select status from user_indexes where status = 'UNUSABLE';

TABLE SPACE

-- ASM Data files
SELECT FILE_NAME, BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'ARSYS';
SELECT FILE_NAME, BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME like 'ARSYS%';
   
CREATE TABLESPACE ARSYS_HOTZONE
GRANT UNLIMITED TABLESPACE TO aradmin

-- Move Tables
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:47812348053
ALTER TABLE T1100 MOVE TABLESPACE HOTZONE
ALTER INDEX I1100_179_1 REBUILD
-- All tables, views, indexes
SELECT OBJECT_NAME,OBJECT_TYPE,OWNER FROM all_objects WHERE owner = 'ARADMIN' AND OBJECT_TYPE IN ('TABLE','VIEW','INDEX')
-- Invalid Views
SELECT 'ALTER VIEW ' || object_name || ' COMPILE;' FROM all_objects WHERE owner = 'ARADMIN' AND object_type IN ('VIEW') AND status = 'INVALID'
ALTER VIEW AR_SYSTEM_EMAIL_MESSAGES COMPILE;
-- Shrink Table
alter table T223 enable row movement;
alter table T223 shrink space compact;
alter table T223 disable row movement;
ALTER INDEX I223_% REBUILD NOLOGGING

Size

SELECT TABLE_NAME, NUM_ROWS FROM TABS WHERE NUM_ROWS > 0 ORDER BY NUM_ROWS DESC;

SELECT s.segment_name, s.blocks, s.bytes, s.segment_type FROM user_segments s ORDER BY bytes DESC;

-- Size in MB and num_rows
SELECT table_name, num_rows, round((num_rows*avg_row_len)/(1024*1024)) MB, LAST_ANALYZED
FROM all_tables 
WHERE num_rows > 0  -- Ignore empty Tables.
ORDER BY mb desc

-- LOBS related to Table and Column
SELECT s.segment_name, l.table_name, l.column_name, s.bytes
FROM user_segments s, user_lobs l
WHERE l.segment_name = s.segment_name
ORDER BY s.bytes desc;

-- Chained Rows
SELECT owner, table_name, chain_cnt FROM dba_tables WHERE chain_cnt > 0;
ANALYZE TABLE tablename LIST CHAINED ROWS;


INDEXES

INDEXES help oracle to find data in a WHERE clause quickly, they do need to be maintained in UPDATE/DELETE statements

SELECT T1157.C1 FROM T1157 WHERE (T1157.C10000901 IS NULL) ORDER BY C1;
CREATE INDEX I1146_179_2 ON aradmin.T1146 (C179,C1);

-- Index Size
SELECT us.segment_name, ui.table_name, ui.uniqueness, ui.num_rows, us.bytes, ui.last_analyzed, blevel, degree, ui.status FROM user_segments us, user_indexes ui WHERE us.segment_name = ui.index_name AND ui.index_name NOT LIKE 'SYS_%'

-- Prepare index rebuilt
SELECT 'ALTER INDEX ' || index_name || ' rebuild compute statistics;' FROM user_indexes where table_name like '%1148' AND index_name not like 'SYS_%'
ALTER INDEX IT1148 rebuild compute statistics;

SELECT index_name,table_name,uniqueness,blevel,degree,num_rows,status from user_indexes where table_name like '%1148' AND index_name not like 'SYS_%'

-- Analyze indexes
-- USE dbms_stats instead ... SELECT 'ANALYZE INDEX ' || OBJECT_NAME || ' COMPUTE STATISTICS;' FROM all_objects WHERE owner = 'ARADMIN' AND OBJECT_TYPE = 'INDEX';
select 'exec dbms_stats.gather_index_stats(ownname=> ||owner||, indname=> || OBJECT_NAME ||);' FROM all_objects WHERE owner = 'ARADMIN' AND OBJECT_TYPE = 'INDEX';
SELECT 'ANALYZE INDEX ' || OBJECT_NAME || ' VALIDATE STRUCTURE;' FROM all_objects WHERE owner = 'ARADMIN' AND OBJECT_TYPE = 'INDEX';

-- Indexes gone bad
SELECT name,height,(del_lf_rows/lf_rows)*100 as del_ratio FROM INDEX_STATS WHERE height > 4 OR (del_lf_rows/lf_rows)*100 > 20;
SELECT index_name,table_name,uniqueness,blevel,degree,num_rows,status from user_indexes where (table_name like 'T%' OR table_name like 'H%') AND index_name not like 'SYS_%' and BLEVEL > 2

-- Rebuilding indexes
ALTER INDEX I776_C303503800_1 REBUILD NOLOGGING
SELECT 'ALTER INDEX ' || index_name  || ' REBUILD NOLOGGING ONLINE COMPUTE STATISTICS;' from user_indexes where (table_name like 'T%' OR table_name like 'H%') AND index_name not like 'SYS_%' and BLEVEL > 2


select table_name, num_rows, blocks "Ever Used", empty_blocks "Never Used", num_rows "Total rows",round((blocks*8),2)||'kb' "used size", round((num_rows*avg_row_len/1024),2)||'kb' "max size" from user_tables where table_name = 'T1148';

-- Index Monitoring
SELECT 'alter index '||index_name||' monitoring usage;' from user_indexes where index_type = 'NORMAL' and table_name IN ('T223','T1397','T2366','T2352','T1148','T1146','T2448','T2351','T776','T2305','T2020','T2546');
ALTER INDEX I148_40000_1 MONITORING USAGE;
ALTER INDEX I148_40000_1 NOMONITORING USAGE;
SELECT table_name, index_name, used FROM v$object_usage WHERE used = 'YES';
SELECT table_name, index_name, used FROM v$object_usage WHERE used = 'NO';

SELECT index_name,table_name,uniqueness,blevel,degree,num_rows,status from user_indexes where index_name IN (SELECT index_name FROM v$object_usage WHERE used = 'YES')

SELECT index_name,table_name,uniqueness,blevel,degree,num_rows,status from user_indexes where index_name IN (SELECT index_name FROM v$object_usage WHERE used = 'NO')
-- EXPLAIN PLAN
SELECT DISTINCT(SQL_ID) FROM V$SQL_PLAN WHERE ORDER BY cpu_cost DESC
SELECT distinct(sql_id), count(sql_id) amount, io_cost FROM V$SQL_PLAN WHERE OPERATION = 'TABLE ACCESS' AND OPTIONS = 'FULL' GROUP BY sql_id, io_cost ORDER BY (io_cost * amount)  DESC NULLS LAST
-- blocking sessions
SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait FROM v$session WHERE blocking_session is not NULL order by blocking_session;

SELECT sid, sql_text FROM v$session s, v$sql q WHERE sid in
    (SELECT sid FROM v$session WHERE state in ('WAITING') and wait_class != 'Idle' and event='enq: TX - row lock contention' AND (q.sql_id = s.sql_id or q.sql_id = s.prev_sql_id));
--history of sessions that block other sessions
select * from (
SELECT a.sql_id ,
a.sample_time ,
ROW_NUMBER() OVER (PARTITION BY a.blocking_session,a.user_id ,a.program
order by blocking_session,a.user_id ,a.program ) rn,
a.blocking_session,a.user_id ,a.program, s.sql_text
FROM sys.WRH$_ACTIVE_SESSION_HISTORY a ,sys.wrh$_sqltext s
where a.sql_id=s.sql_id
and blocking_session_serial# <> 0
and a.user_id <> 0
) where rn = 1
	
SELECT username U_NAME, owner OBJ_OWNER,
object_name, object_type, s.osuser,
DECODE(l.block,
  0, 'Not Blocking',
  1, 'Blocking',
  2, 'Global') STATUS,
  DECODE(v.locked_mode,
    0, 'None',
    1, 'Null',
    2, 'Row-S (SS)',
    3, 'Row-X (SX)',
    4, 'Share',
    5, 'S/Row-X (SSX)',
    6, 'Exclusive', TO_CHAR(lmode)
  ) MODE_HELD
FROM gv$locked_object v, dba_objects d,
gv$lock l, gv$session s
WHERE v.object_id = d.object_id
AND (v.object_id = l.id1)
AND v.session_id = s.sid
ORDER BY username, session_id;
-- Full Table Scans
SELECT
   p.object_owner, p.object_name, t.num_rows, ltrim(t.cache) ch, decode(t.buffer_pool,'KEEP','Y','DEFAULT','N') K, s.blocks, sum(a.executions) nbr_FTS, p.sql_id, a.sql_text
FROM
   dba_tables t, dba_segments s, v$sqlarea a,
   (SELECT distinct address, object_owner, sql_id, object_name FROM v$sql_plan WHERE operation = 'TABLE ACCESS' AND options = 'FULL' AND object_name not like 'MLOG%') p
WHERE
   a.address = p.address
   AND t.owner = s.owner
   AND t.table_name = s.segment_name
   AND t.table_name = p.object_name
   AND t.owner = p.object_owner
   AND t.owner not in ('SYS','SYSTEM')
HAVING
   sum(a.executions) > 1
GROUP BY
   p.object_owner, p.object_name, t.num_rows, t.cache, t.buffer_pool, s.blocks, p.sql_id, a.sql_text
order by
   s.blocks desc, sum(a.executions) desc;
-- activity per session
SELECT a.SID, a.status, a.last_call_et, A.SID, A.username, C.piece, c.sql_text sqltext FROM v$session a, v$sqltext c WHERE a.sql_address = c.address(+);

OPEN CURSORS

-- open cursor
select max(a.value) as highest_open_cur, p.value as max_open_cur from v$sesstat a, v$statname b, v$parameter p where a.statistic# = b.statistic# and b.name = 'opened cursors current' and p.name= 'open_cursors' group by p.value;

-- which session portal is using for open cursors?
select a.value, s.username, s.sid, s.serial# from v$sesstat a, v$statname b, v$session s where a.statistic# = b.statistic# and s.sid=a.sid and b.name = 'opened cursors current' AND s.username = 'LPORTAL';

What keeps the database busy?

-- execution time v.s. disk io
SELECT to_char( to_date( round(ELAPSED_TIME/1000000, 0), 'sssss'), 'hh24:mi:ss') as TIME,
      SQL_ID, 
      Executions,
      DISK_READS,
      DIRECT_WRITES,
      to_char(LAST_ACTIVE_TIME, 'YYYY-MON-DD-HH24:MI:SS') as "Last Active Time",
      BUFFER_GETS,
      CPU_TIME,
      floor(round(sum((Executions * ELAPSED_TIME)/1000000), 0)/86400) || 'd ' || 
           to_char(to_date(mod(round(sum((Executions * ELAPSED_TIME)/1000000), 0),86400), 'sssssss'), 'hh24"h" mi"m" ss"s"') as "total_time",
      sql_text
 from v$sql    
 WHERE ELAPSED_TIME >= 10000000 --this is 10 seconds
 GROUP BY ELAPSED_TIME, SQL_ID, Executions, DISK_READS, DIRECT_WRITES, LAST_ACTIVE_TIME, BUFFER_GETS, CPU_TIME, sql_text
ORDER BY 9 DESC
SELECT SQL_ID, SQL_TEXT, Executions, BUFFER_GETS, DISK_READS, DIRECT_WRITES, to_char(LAST_ACTIVE_TIME, 'YYYY-MON-DD-HH24:MI:SS'), CPU_TIME FROM v$sql
SELECT MIN(LAST_ACTIVE_TIME) FROM v$sql
SELECT SQL_TEXT FROM v$sql WHERE LAST_ACTIVE_TIME < '28-MAY-14'
-- find SQL by ID
SELECT SQL_TEXT FROM V$SQL WHERE SQL_ID = '7pf3kz41synpu';
-- bind value
select child_address, name, value_string FROM v$sql_bind_capture WHERE sql_id='44v0t18cz509t'
-- Find entries that were last updated more than 13 months ago.
DELETE FROM T2354 WHERE C6 < (sysdate - to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') - 396)*86400
DELETE FROM T1148 WHERE C6 < (sysdate - to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') - 396)*86400

Deadlocks

SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait FROM v$session WHERE sid = 229

SELECT sid, sql_text FROM v$session s, v$sql q WHERE sid in (SELECT sid FROM v$session WHERE blocking_session is not NULL)

select s1.username || '@' || s1.machine
 || ' ( SID=' || s1.sid || ' )  is blocking '
 || s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
 from v$lock l1, v$session s1, v$lock l2, v$session s2
 where s1.sid=l1.sid and s2.sid=l2.sid
 and l1.BLOCK=1 and l2.request > 0
 and l1.id1 = l2.id1
 and l2.id2 = l2.id2 ;

alter system kill session '229,2159' immediate;
-- Major Cleanup
SELECT COUNT(C6) FROM T1397 WHERE C6 < (sysdate - to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') - 396)*86400;
DELETE FROM T1397 WHERE C6 < (sysdate - to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') - 396)*86400;
COMMIT

alter table T1397 enable row movement;
alter table T1397 shrink space compact;
alter table T1397 disable row movement;

EXEC DBMS_STATS.GATHER_TABLE_STATS ('ARADMIN', 'T1397');
--
EXEC DBMS_STATS.gather_table_stats('SMAPP', 'SIM');

EXEC DBMS_STATS.UNLOCK_SCHEMA_STATS ('DWH');
EXEC DBMS_STATS.GATHER_TABLE_STATS ('DWH', 'DS_PARTB');
EXEC DBMS_STATS.GATHER_TABLE_STATS ('DWH', 'DS_PARTB');
EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'DWH', cascade=>TRUE);
-- AWR 
SELECT snap_id,
  snap_level,
  begin_interval_time
FROM
   dba_hist_snapshot
WHERE begin_interval_time like '25-SEP-14%'
ORDER BY begin_interval_time;
70594
70630
instance: 1
db: 3096395807
@awrrpt.sql
/u01/app/oracle/product/11.1/db/rdbms/admin