Search This Blog

Total Pageviews

Tuesday, 24 November 2020

Oracle Table info..

 

Oracle Table info.. ..



http://anuj-singh.blogspot.com/2010/08/oracle-all-table-info.html?m=0



ALTER SESSION SET NLS_TIMESTAMP_FORMAT='DD-MON-YY HH:MI:SSXFF';
alter session set nls_date_format = 'DD-MON-YYYY HH24:MI:SS';

var h varchar2(30)
 begin :h := 'T4'; end;  ---- table name here!!!!
/

Or



var h varchar2(30)
 begin :h := '&tb_name'; end;  ---- table name here!!!!
/




SET LINESIZE 300 VERIFY OFF
COLUMN owner FORMAT A20
COLUMN table_name FORMAT A20
COLUMN index_name FORMAT A30
col global_stats        for a15
col COMPRESS_FOR for a15
SELECT owner,
       table_name,
       num_rows,
COMPRESSION,
COMPRESS_FOR,
       blocks,
       empty_blocks,
       avg_space
       chain_cnt,
       avg_row_len,
       PARTITIONED,
       TABLESPACE_NAME,
       last_analyzed,
       SAMPLE_SIZE,
    --  stale_stats,
      global_stats,
      initial_extent,
      ini_trans,
      freelists
FROM   dba_tables
WHERE 1=1  
AND    table_name =:h
;



col TABLE_NAME      heading 'Table'          format a20 trunc
col NUM_ROWS        heading 'Rows'          format 99,999,999
col AVG_ROW_LEN     heading 'Avg|Row|Len'    format 99999
col BLOCKS          heading 'Blocks|In use' format 999,999
col EMPTY_BLOCKS    heading 'Empty|Blocks'  format 999,999
col PCT_BLKS_USED   heading 'Pct|Alloc|Spce|Used' format 999
col SPACE_FULL      heading 'Pct|Each|Blck|Full'  format 999
col PCT_FREE        heading 'Pct|Free'      format 999
col PCT_USED        heading 'Pct|Used'      format 999

select  TABLE_NAME,
        NUM_ROWS,
AVG_ROW_LEN,
        BLOCKS,
        EMPTY_BLOCKS, 
BLOCKS/decode((BLOCKS+EMPTY_BLOCKS),0,1,(BLOCKS+EMPTY_BLOCKS))*100 PCT_BLKS_USED,
        decode(BLOCKS,0,0,100-((BLOCKS * AVG_SPACE)/(BLOCKS * 8192))*100) SPACE_FULL,
        PCT_FREE,
        PCT_USED
from    sys.dba_tables
where   1=1
--and owner = upper('SCOTT') 
and table_name =:h
order by  table_name
/


 alter session set nls_date_format='dd-mm-yyyy hh24:mi' ;

set linesize 300 pagesize 300
col OWNER for a20 
col OBJECT_NAME for a20
col SUBOBJECT_NAME for a20
define 1 ='XXX'

select owner,object_name,subobject_name,created from dba_objects  where object_name='&1' 
and owner= 'XXX'   
and object_type='TABLE PARTITION' 
and created > TRUNC(SYSDATE+1) - INTERVAL '1' YEAR 
order by created
;






SET LINESIZE 300 VERIFY OFF
COLUMN owner FORMAT A20
COLUMN table_name FORMAT A30
COLUMN index_name FORMAT A30
col global_stats        for a15
col PARTITIONED for a15
SELECT owner,
       table_name,
       num_rows,
       blocks,
       empty_blocks,
       avg_space
       chain_cnt,
       avg_row_len,
       PARTITIONED,
       TABLESPACE_NAME,
       last_analyzed,
       SAMPLE_SIZE,
    --  stale_stats,
      global_stats,
      initial_extent,
      ini_trans,
      freelists
FROM   dba_tables
WHERE 1=1  
AND    and table_name=:h
;




SET LINESIZE 300 VERIFY OFF
COLUMN owner FORMAT A20
COLUMN table_name FORMAT A30
COLUMN index_name FORMAT A30
col global_stats        for a15
col PARTITIONED for a15
col COMPRESS_FOR for a15
SELECT owner,
index_name,
status,       
table_name,
       num_rows,
COMPRESSION,
       PARTITIONED,
       TABLESPACE_NAME,
       last_analyzed,
       SAMPLE_SIZE,
      global_stats,
      initial_extent,
      ini_trans,
      freelists
FROM   dba_indexes



alter index scott.INDEX_NAME rebuild online;

set heading off
 set echo off
 Set pages 999
 set long 90000
 select dbms_metadata.get_ddl('INDEX','INDEX_NAME','SCOTT') from dual;


alter index scott.INDEX_NAME rebuild online;



--INI_TRANS for index and table 
set pagesize 300  linesize 300
alter session set nls_date_format='dd-mm-yyyy hh24:mi';
col INDEX_TYPE for a12
col OWNER  for a12
col INDEX_NAME for a20
col table_name 
select i.table_name,i.owner,i.INDEX_NAME,i.INDEX_TYPE,i.INI_TRANS,i.MAX_TRANS,i.PCT_FREE,i.LAST_ANALYZED,t.PARTITIONED,t.INI_TRANS tab_INI_TRANS,t.MAX_TRANS tab_MAX_TRANS ,t.PCT_FREE tab_PCT_FREE ,t.TABLESPACE_NAME,t.TEMPORARY 
from dba_indexes i,dba_tables t
   where 1=1
--and t.table_name in (':h')
   -- and t.table_name ='LOG'
   and i.table_name=t.table_name
 --  and index_type='NORMAL' 
;




SET LINES 500 pagesize 300
COLUMN owner             FORMAT a20 HEADING 'Owner'
COLUMN index_name        FORMAT a25 HEADING 'Index'
COLUMN partition_name    FORMAT a20 HEADING 'Partition'
COLUMN tablespace_name   FORMAT a15 HEADING 'Tablespace'
COLUMN pct_free          FORMAT 9999 HEADING '%|Free'
COLUMN ini_trans         FORMAT 9999 HEADING 'Init|Tran'
COLUMN max_trans         FORMAT 9999 HEADING 'Max|Tran'
COLUMN initial_extent    FORMAT 9999999 HEADING 'Init|Extent'
COLUMN next_extent       FORMAT 9999999 HEADING 'Next|Extent'
COLUMN max_extent        HEADING 'Max|Extents'
COLUMN pct_increase      FORMAT 999 HEADING '%|Inc'
COLUMN distinct_keys     FORMAT 9999999 HEADING '#Keys'
COLUMN clustering_factor FORMAT 999999 HEADING 'Clus|Fact'
col table_name for a25
col high_value for a90
BREAK ON index_owner on index_name

SELECT
   a.index_owner,
   a.index_name,
   b.table_name,
   a.tablespace_name,
   a.partition_name,
   a.pct_free,
   a.ini_trans,
   a.max_trans,
   a.initial_extent,
   a.next_extent,
   a.max_extent,
   a.pct_increase,
   a.distinct_keys,
   a.clustering_factor,
   b.logging,
   b.status,
   a.compression, ----
 a.high_value
FROM    dba_ind_partitions a, dba_indexes b
where 1=1
and a.index_name=b.index_name
and b.table_name=:h
ORDER BY   index_owner,index_name;



SELECT 
owner,
index_name,
       blevel,
       leaf_blocks,
       distinct_keys,
       avg_leaf_blocks_per_key,
       avg_data_blocks_per_key,
       clustering_factor,
       num_rows,
       TABLESPACE_NAME,
       global_stats,
       last_analyzed,
initial_extent,
      ini_trans,
      freelists
FROM   dba_indexes
WHERE  1=1
and table_name =:h
ORDER BY index_name
;



-- index rebuild

define IF_COMMENT=' '
--define IF_COMMENT='--' 
SELECT 'ALTER INDEX ' || OWNER || '.' ||INDEX_NAME || ' REBUILD ' ||' TABLESPACE ' || TABLESPACE_NAME || ';'
FROM DBA_INDEXES
WHERE STATUS='UNUSABLE'
&IF_COMMENT and owner not in ('AUDSYS','DBVISIT7', 'SYS' , 'SYSTEM' , 'DBSNMP' , 'SYSMAN' , 'OUTLN' ,'MDSYS' , 'ORDSYS' , 'EXFSYS' , 'DMSYS' , 'WMSYS' , 'CTXSYS' , 'ANONYMOUS' , 'XDB' , 'ORDPLUGINS' , 'OLAPSYS' , 'PUBLIC','WWV_FLOW_PLATFORM' ) 
UNION
SELECT 'ALTER INDEX ' || INDEX_OWNER || '.' ||INDEX_NAME ||' REBUILD PARTITION ' || PARTITION_NAME ||' TABLESPACE ' || TABLESPACE_NAME || ';'
FROM DBA_IND_PARTITIONS
WHERE STATUS='UNUSABLE'
&IF_COMMENT and INDEX_OWNER not in ('AUDSYS','DBVISIT7', 'SYS' , 'SYSTEM' , 'DBSNMP' , 'SYSMAN' , 'OUTLN' ,'MDSYS' , 'ORDSYS' , 'EXFSYS' , 'DMSYS' , 'WMSYS' , 'CTXSYS' , 'ANONYMOUS' , 'XDB' , 'ORDPLUGINS' , 'OLAPSYS' , 'PUBLIC','WWV_FLOW_PLATFORM' ) 
UNION
SELECT 'ALTER INDEX ' || INDEX_OWNER || '.' ||INDEX_NAME ||' REBUILD SUBPARTITION '||SUBPARTITION_NAME||' TABLESPACE ' || TABLESPACE_NAME || ';'
FROM DBA_IND_SUBPARTITIONS
WHERE STATUS='UNUSABLE'
&IF_COMMENT and INDEX_OWNER not in ('AUDSYS','DBVISIT7', 'SYS' , 'SYSTEM' , 'DBSNMP' , 'SYSMAN' , 'OUTLN' ,'MDSYS' , 'ORDSYS' , 'EXFSYS' , 'DMSYS' , 'WMSYS' , 'CTXSYS' , 'ANONYMOUS' , 'XDB' , 'ORDPLUGINS' , 'OLAPSYS' , 'PUBLIC','WWV_FLOW_PLATFORM' ) 
;


SET VERIFY OFF LINESIZE 200

COLUMN owner FORMAT A20
COLUMN table_name FORMAT A30

SELECT 
t.owner,
t.table_name,
       t.tablespace_name,
       t.num_rows,
       t.avg_row_len,
       t.blocks,
       t.empty_blocks,
       ROUND(t.blocks * ts.block_size/1024/1024,2) AS size_mb
FROM   dba_tables t
       JOIN dba_tablespaces ts ON t.tablespace_name = ts.tablespace_name
WHERE 1=1   
-- and t.owner = UPPER('')
and table_name =:h
ORDER BY t.table_name;


COLUMN owner FORMAT A20
COLUMN table_name FORMAT A30
COLUMN index_name FORMAT A30
col global_stats        for a15

SELECT owner,
      index_name,
       table_name,
        PARTITIONED,
       index_type,
       TABLESPACE_NAME,
       last_analyzed,
       SAMPLE_SIZE,
      global_stats,
      initial_extent,
      ini_trans,
      freelists
FROM   dba_indexes
WHERE 1=1  
AND    table_name =:h
;



define 1='402'
SET LINESIZE 300 VERIFY OFF
COLUMN owner FORMAT A20
COLUMN object_name FORMAT A20
COLUMN edition_name FORMAT A15

SELECT owner,
       object_name,
       --subobject_name,
       object_id,
       data_object_id,
       object_type,
       TO_CHAR(created, 'DD-MON-YYYY HH24:MI:SS') AS created,
       TO_CHAR(last_ddl_time, 'DD-MON-YYYY HH24:MI:SS') AS last_ddl_time,
       timestamp,
       status,
       temporary,
       generated,
       secondary,
       --namespace,
       edition_name
FROM   dba_objects
WHERE  UPPER(object_name) LIKE UPPER('%&1%')
ORDER BY owner, object_name;




set linesize 300
COLUMN     tab_column_name           FORMAT A30              HEADING 'Column Name'
COLUMN     tab_column_datatype       FORMAT A20              HEADING 'Datatype'
COLUMN     tab_column_nullable       FORMAT A10              HEADING 'Nullable?'
COLUMN     tab_column_numdistinct    FORMAT 999,999,999      HEADING 'Distinct|Values'
COLUMN     tab_column_density        FORMAT 9.99999          HEADING 'Density'
COLUMN     tab_column_numnulls       FORMAT 999,999,999      HEADING 'Number|of Nulls'
COLUMN     tab_column_histogram      FORMAT A16              HEADING 'Histogram'
COLUMN     tab_column_numbuckets     FORMAT 999,999          HEADING 'Buckets'
col IND_NAME  for a20
col TABLE_NAME for a25
SELECT     i.index_name                                    ind_name,
           i.table_name ,
           i.status                                        ind_status,
           DECODE(i.uniqueness,'UNIQUE','Y',NULL)          ind_unique,
           i.blevel                                        ind_blevel,
           i.leaf_blocks                                   ind_leafblocks,
           i.num_rows                                      ind_numrows,
           i.distinct_keys                                 ind_distinctkeys,
           i.clustering_factor                             ind_clufac,
           TO_CHAR(i.last_analyzed, 'DD/MM/YYYY hh24:mi')  last_analyzed_time
FROM       dba_indexes i
WHERE      i.index_name = 'SYS_C0051402'
ORDER BY   i.uniqueness DESC, i.index_name
/



prompt DEFAULT ATTRIBUTES TABLESPACE for partition table 

set linesize 400 pagesize 300 
col owner for a20
col TABLE_NAME for a20 
select 
 OWNER   ,                  
 TABLE_NAME  ,              
 PARTITIONING_TYPE  ,       
 SUBPARTITIONING_TYPE  ,    
 PARTITION_COUNT,           
 DEF_SUBPARTITION_COUNT ,   
 PARTITIONING_KEY_COUNT ,   
 SUBPARTITIONING_KEY_COUNT ,
 STATUS   ,    
 DEF_TABLESPACE_NAME   ---- <<<<<<<  
from   DBA_PART_TABLES  
WHERE 1=1
-- DEF_TABLESPACE_NAME='OLD_TABLESPACE_NAME'
and TABLE_NAME=:h



-- ALTER USER XXX DEFAULT TABLESPACE users;

--ALTER TABLE t MODIFY DEFAULT ATTRIBUTES TABLESPACE users;
 --alter table t modify default attributes lob (x ) ( tablespace users );


------------------------***********
-- Function-based Index 

col owner for a15
col index_name for a30
col index_type for a21
select owner, index_name, index_type,table_name from dba_indexes
where 1=1
and index_type like 'FUNCTION-BASED%'
and table_name =:h;


--set linesize 300 pagesize 300
col TABLE_NAME for a20
col TABLE_OWNER for a20
col INDEX_NAME for a40
col column_expression for a100
SELECT table_owner,
       TABLE_NAME,
       index_name,
       column_expression
FROM dba_ind_expressions
WHERE 1=1
and table_owner not in ('SYS','SYSTEM')
AND    table_name =:h


------------------------***********

--- local index? 
select owner,index_name,DEF_TABLESPACE_NAME, PARTITIONING_TYPE,LOCALITY from DBA_PART_INDEXES 
where 1=1
-- and  status='UNUSABLE' 
and TABLE_NAME=:h
order by 1,2;




set linesize 300 
col INDEX_NAME for a20
col TABLE_NAME for a20
col locality for a15
col TABLE_NAME for a20
select
TABLE_NAME,
INDEX_NAME ,          
TABLE_NAME,           
PARTITIONING_TYPE ,   
SUBPARTITIONING_TYPE ,
PARTITION_COUNT ,     ----<<<<-- 
partitioning_type,
alignment,
locality
from   DBA_PART_indexes
where   table_name = :h;




prompt Any VIRTUAL_COLUMN !!!!!!!!!!!!?
set linesize 300 pagesize 300
col owner for a15
col hidden_column for a15
col virtual_column for a15
col table_name for a20
select owner,TABLE_NAME,column_name, column_id, internal_column_id, hidden_column, virtual_column
from dba_tab_cols
where table_name = :h
;


alter session set nls_date_format='dd-mm-yyyy hh24:mi';
set linesize 300 pagesize 300
col column_name for a30
col low_value for a40
col high_value for a40
col endpoint_actual_value         for a30
col DATA_TYPE for a12
col DATA_DEFAULT for a15
col LOW_VALUE for a20 
col HIGH_VALUE for a20 
col OWNER for a15

SELECT 
owner,
column_id,
       column_name,
       num_distinct,
       avg_col_len,
       histogram,
       low_value,
       high_value,
       data_type,
       data_default,
       hidden_column
       FROM   dba_tab_columns
WHERE  1=1
AND    table_name =:h
ORDER BY column_id
;



BREAK ON TODAY
COLUMN TODAY NEW_VALUE _DATE
SELECT TO_CHAR(sysdate,'mm/dd/yy hh24:mi') TODAY FROM DUAL;     
COLUMN INSTANCE NEW_VALUE _INST
SELECT LTRIM(RTRIM(GLOBAL_NAME)) INSTANCE FROM GLOBAL_NAME;
BTITLE OFF
CLEAR BREAKS

TTITLE  LEFT   'dba_find_constr' -
CENTER _INST -
        RIGHT  _DATE SKIP 1 -
        CENTER 'ALL CONSTRAINTS FOR A GIVEN TABLE' -
        RIGHT  'Page ' FORMAT 9999 SQL.PNO SKIP 2
 

 
col for_owner         for     a10       head 'Child|Owner'          just l
col for_table         for     a10       head 'Child|Table'          just l
col for_constr        for     a35       head 'Child|Constraint'     just l
col pri_owner         for     a10       head 'Parent|Owner'         just l
col pri_table         for     a10       head 'Parent|Table'         just l
col pri_constr        for     a20       head 'Parent|Constraint'    just l
col rule              for     a10       head 'Rule'                 just l
col status            for     a08       head 'Status'               just l
col type              for     a04       head 'Type'     just l
 
spool dba_find_constr.lst

select
a.owner for_owner,
a.table_name for_table,
a.constraint_name for_constr,
b.owner pri_owner,
b.table_name pri_table,
b.constraint_name pri_constr,
a.delete_rule rule,
a.status status,
a.constraint_type type
from dba_constraints a, dba_constraints b
where a.r_constraint_name = b.constraint_name
  and a.constraint_type = 'R'
  and b.constraint_type = 'P'
  and b.owner = upper('&ownr')
  and b.table_name = :h
union all
select
b.owner for_owner,
b.table_name for_table,
b.constraint_name for_constr,
a.owner pri_owner,
a.table_name pri_table,
a.constraint_name pri_constr,
b.delete_rule rule,
b.status status,
b.constraint_type type
from dba_constraints a, dba_constraints b
where a.constraint_name = b.r_constraint_name
  and a.constraint_type = 'P'
  and b.constraint_type = 'R'
  --and b.owner = upper('ownr')
  and b.table_name = :h
union all
select
'' for_owner,
'' for_table,
'' for_constr,
b.owner pri_owner,
b.table_name pri_table,
b.constraint_name pri_constr,
b.delete_rule rule,
b.status status,
b.constraint_type type
from dba_constraints b
where 1=1 
-- and b.owner = upper('ownr')
  and b.table_name = :h
  and b.constraint_type in ('C','P')
/

undef ownr
undef tbl



set linesize 300
col constraint_name     for A18                HEADING "Constraint Name"
col constraint_type     for A20                HEADING "Constraint|Type"
col search_condition    for A15                HEADING "Search Condition"
col r_constraint_name   for A20                HEADING "R / Constraint Name"
col delete_rule         for A11                HEADING "Delete Rule"
col status                                     HEADING "Status"
col COLUMN_NAME for a20
BREAK ON constraint_name ON constraint_type
select 
    a.constraint_name
  , DECODE(a.constraint_type
             , 'P', 'Primary Key'
             , 'C', 'Check'
             , 'R', 'Referential'
             , 'V', 'View Check'
             , 'U', 'Unique'
             , a.constraint_type
    ) constraint_type
  , b.column_name
  , a.search_condition
  , NVL2(a.r_owner, a.r_owner || '.' ||  a.r_constraint_name, null) r_constraint_name
  , a.delete_rule
  , a.status
FROM     dba_constraints  a  , dba_cons_columns b
WHERE 1=1
  AND a.table_name       = b.table_name
  AND a.constraint_name  = b.constraint_name
  AND b.table_name       = :h
ORDER BY
    a.constraint_name , b.position
/

set linesize 300
col table_name for a20
col column_name for a15
select TABLE_NAME,COLUMN_NAME,PCTVERSION,RETENTION,SECUREFILE,RETENTION_TYPE,RETENTION_VALUE from dba_lobs where table_name=:h
;


set linesize 300 pagesize 100
col DATA_TYPE for a20
col COLUMN_NAME for a200
select DATA_TYPE , listagg(COLUMN_NAME, '|') within group (order by COLUMN_NAME) as COLUMN_NAME  from DBA_TAB_COLUMNS where TABLE_NAME=:h
group by DATA_TYPE;


--- 


--Statistics on Partitioned Tables -- analyzed time 

set linesize 300
col OWNER for a20
SELECT a.table_name,
       a.partition_name,
       a.tablespace_name,
       a.initial_extent,
       a.next_extent,
       a.pct_increase,
       a.num_rows,
       a.avg_row_len,
       last_analyzed,
       global_stats
FROM   dba_tab_partitions a
WHERE  a.table_name  = :h
-- AND    a.table_owner = Upper('')
ORDER BY a.table_name, a.partition_name



-- with Partition date ? 
set linesize 300 pagesize 300
col PARTITION_NAME for a30
col HIGH_VALUE for a40
col TABLE_NAME for a25
SELECT * from (
SELECT table_name,PARTITION_NAME,
extractvalue
( dbms_xmlgen.getxmltype
( 'select high_value
from DBA_TAB_PARTITIONS where table_name = ''' || t.table_name || ''' and PARTITION_NAME = ''' || t.PARTITION_NAME || ''''),'//text()' ) as high_value 
FROM DBA_TAB_PARTITIONS t
WHERE TABLE_NAME = :h)
order by high_value desc;



set linesize 300 pagesize 300
col PARTITION_NAME for a30
col HIGH_VALUE for a40
col TABLE_NAME for a25
col num_rows for 99999999999
SELECT * from (
SELECT TABLE_NAME,PARTITION_NAME,tablespace_name,NUM_ROWS,
extractvalue
( dbms_xmlgen.getxmltype
( 'select high_value
from DBA_TAB_PARTITIONS where table_name = ''' || t.table_name || ''' and PARTITION_NAME = ''' || t.PARTITION_NAME || ''''),
'//text()' ) as high_value 
FROM DBA_TAB_PARTITIONS t
WHERE 1=1
--and TABLE_NAME = 'XXX'
and TABLE_NAME = :h
)
where 1=1
--and HIGH_VALUE like '%2023%' 
order by high_value desc;

===

alter session set nls_date_format = 'DD-MON-YYYY HH24:MI';
 
 
 set linesize 300 pagesize 300 
 col TABLE_NAME   for a15                                                                                                                    
 col PARTITION_NAME for a15
 col TABLE_OWNER for a15
 SELECT 
 t.TABLE_OWNER
 ,t.table_name
 ,      t.partition_name
 ,      t.partition_position
 ,      (to_date(x2.dt,'YYYYMMDDHH24MISS') -1 )hi
 FROM   dba_tab_partitions t
 ,      xmltable('for $i in /ROWSET/ROW/HI
                  return $i'
                 passing xmltype(
                           dbms_xmlgen.getxml
                           ('select high_value hi from dba_tab_partitions x'
                          ||' where x.table_name     = '''||t.table_name||''''
                          ||' and   x.partition_name = '''|| t.partition_name|| ''''))
                 columns dt varchar2(4000) path '/') x
   ,      xmltable('for $i in /ROWSET/ROW/DT
                    return $i'
                 passing xmltype(dbms_xmlgen.getxml(q'[select to_char(]'||x.dt||q'[,'YYYYMMDDHH24MISS') dt from dual]'))
                 columns dt varchar2(16) path '/') x2
 WHERE  t.table_name = 'REP'
--order by t.partition_position 
;


====



-- Partition size 

alter session set nls_date_format='dd-mm-yyyy hh24:mi';


alter session set container=xxx ;

define SEGMENT_NAME='REP'  --- table name 
define TABLE_OWNER='REP'
define TABLE_NAME='REP'

set linesize 300 pagesize 300
col TABLE_NAME for a20
col PARTITION_NAME for a20
col HIGH_VALUE for a40
 col size1 for a8

select  distinct table_name, a.partition_name, num_rows, dbms_xplan.FORMAT_SIZE(BYTES) size1 , last_analyzed,created,high_value
 from (SELECT distinct d.table_name, d.partition_name, d.num_rows,SUM(BYTES) BYTES, d.last_analyzed,created
                            FROM DBA_SEGMENTS S,dba_tab_partitions d,dba_objects o
                            WHERE 1=1
                          -- S.PARTITION_NAME = P.PARTITION_NAME
                            and S.PARTITION_NAME = d.PARTITION_NAME
                            AND SEGMENT_NAME='&SEGMENT_NAME'
                           -- and s.OWNER='REPORTS'
                            and o.OWNER=s.OWNER
and o.subobject_name=s.PARTITION_NAME
--and d.PARTITION_NAME='SYS_P9988'
and TABLE_OWNER='&TABLE_OWNER'
--and s.OWNER=d.TABLE_OWNER
and o.OWNER=d.TABLE_OWNER
and SUBOBJECT_NAME=d.PARTITION_NAME
and object_name=TABLE_OWNER
group by d.table_name, d.partition_name, d.num_rows, d.last_analyzed,created
order by created
)a,
(select distinct 
extractvalue
( dbms_xmlgen.getxmltype
( 'select high_value
from DBA_TAB_PARTITIONS where table_name = ''' || t.table_name || ''' and PARTITION_NAME = ''' || t.PARTITION_NAME || ''''),
'//text()' ) as high_value ,PARTITION_NAME
FROM DBA_TAB_PARTITIONS t
WHERE 1=1
and TABLE_NAME = '&TABLE_NAME') b
where 1=1
and a.partition_name=b.partition_name
order by high_value
;





  col TABLE_OWNER for a20
  col TABLE_NAME for a20
  WITH subq_pos_empty AS
   (SELECT t.table_owner
    ,      t.table_name
    ,      t.partition_name
    ,      x.cnt
    FROM   dba_segments         s
    ,      dba_tab_partitions   t
    ,      xmltable('for $i in /ROWSET/ROW/CNT
                     return $i'
                    passing xmltype(
                             dbms_xmlgen.getxml
                             ('select count(*) cnt '
                            ||'from '||t.table_owner||'.'||t.table_name||' PARTITION ('||t.partition_name||') '
                            --||'SAMPLE(.01)' -- If you want to sample to speed up unexpected large seg counts
                              ))
                    columns cnt number path '/') x
    WHERE  s.segment_type       = 'TABLE PARTITION'
    --AND    t.table_owner      LIKE 'XYZ%'
	and t.table_owner ='REPORTS'
    AND    t.table_name         = 'REPORTS' 
    AND    t.table_owner        = s.owner
    AND    t.table_name         = s.segment_name
    AND    t.partition_name     = s.partition_name
  --  AND    t.num_rows           = 0
    AND    t.partition_position > 1)
   SELECT *
   FROM   subq_pos_empty
   WHERE 1=1
-- and   cnt = 0
   ORDER BY
          table_owner
   ,      table_name
   ,      partition_name;





--- 

-- exec dbms_stats.gather_table_stats('OWNER', 'TABLE_NAME', granularity => 'SUBPARTITION', partname => 'P_20100211');


alter session set nls_date_format = 'DD-MON-YYYY HH24:MI:SS';
set linesize 200 pages 250 set verify off
col blevel format 99
col GLOBAL_STATS for a15
col PARTITIONED for a15
col table_name format a22 heading 'TABLE NAME' 
col u     format a1 heading 'U'
col index_name format a25 heading 'INDEX NAME'
col column_name format a23 heading 'COLUMN NAME' 
col column_position format 99 heading 'SEQ'
col column_length format 9999 heading 'LEN'
col leaf_blocks format 999990 heading 'LEAF|BLOCKS'
col distinct_keys format 9999990 heading 'DISTINCT|KEYS'
col avg_leaf_blocks_per_key format 999990 heading 'LEAF|BLKS|/KEY' 
col avg_data_blocks_per_key format 999990 heading 'DATA|BLKS|/KEY' 
rem break on table_name skip 1 on index_name on u rem
select i.table_name,COLUMN_NAME,i.blevel, i.leaf_blocks, i.distinct_keys,i.avg_leaf_blocks_per_key, i.avg_data_blocks_per_key,
decode( i.uniqueness, 'NONUNIQUE', null, 'UNIQUE', 'U', 'BITMAP', 'B', '?' ) u, i.index_name,i.last_analyzed, i.clustering_factor,partitioned,global_stats,status
from sys.dba_ind_columns c, sys.dba_indexes i
where 1=1
-- and  (i.table_owner,i.table_name) in (select OBJECT_OWNER,OBJECT_NAME from gV$SQL_PLAN where HASH_VALUE= )
and i.owner = c.index_owner
and i.index_name = c.index_name
and i.table_name=:h
--and owner='ANUJ'
order by i.table_owner, i.table_name, i.index_name, c.column_position
/


set linesize 300 pagesize 300
col subpartition_name  for a20
col partition_name for a20
select
     owner ,                  
     table_name    ,          
     partition_name   ,       
     partition_position   ,   
     subpartition_name ,      
     stale_stats
     from dba_tab_statistics 
     where table_name =:h
;


-- Reverse Key Indexes index_type  --- 'NORMAL/REV' ??

alter session set nls_date_format = 'DD-MON-YYYY HH24:MI:SS';
set linesize 300 pages 250 set verify off
col blevel format 99
col GLOBAL_STATS for a15
col PARTITIONED for a15
col table_name format a22 heading 'TABLE NAME' 
col u format a1 heading 'U'
col index_name format a25 heading 'INDEX NAME'
col column_name format a23 heading 'COLUMN NAME' 
col column_position format 99 heading 'SEQ'
col column_length format 9999 heading 'LEN'
col leaf_blocks format 999990 heading 'LEAF|BLOCKS'
col distinct_keys format 9999990 heading 'DISTINCT|KEYS'
col avg_leaf_blocks_per_key format 999990 heading 'LEAF|BLKS|/KEY' 
col avg_data_blocks_per_key format 999990 heading 'DATA|BLKS|/KEY' 
COL tsp_name FORMAT A20 HEADING "Tablespace|Name"
rem break on table_name skip 1 on index_name on u rem

select i.table_name,COLUMN_NAME,i.blevel, i.leaf_blocks, i.distinct_keys,i.avg_leaf_blocks_per_key, i.avg_data_blocks_per_key,
decode( i.uniqueness, 'NONUNIQUE', null, 'UNIQUE', 'U', 'BITMAP', 'B', '?' ) u,
 i.index_name,i.last_analyzed, i.clustering_factor,partitioned,global_stats,status
, index_type  --- 'NORMAL/REV' ??
,tablespace_name tsp_name
,initial_extent
,ini_trans
,freelists
from sys.dba_ind_columns c, sys.dba_indexes i
where 1=1
-- and  (i.table_owner,i.table_name) in (select OBJECT_OWNER,OBJECT_NAME from gV$SQL_PLAN where HASH_VALUE= )
and i.owner = c.index_owner
and i.index_name = c.index_name
and i.table_name=:h
--and owner='SYS'
order by i.table_owner, i.table_name, i.index_name, c.column_position
/




SET LINESIZE 200
col owner for A20
col extension_name for A15
col extension for A50
col TABLE_NAME  for a25
SELECT owner, table_name, extension_name, extension FROM   dba_stat_extensions where 1=1
and table_name=:h
ORDER by owner, table_name;


column col_group format a30
 
select e.extension col_group,
       t.num_distinct,
       t.histogram
from   dba_stat_extensions e
       join dba_tab_col_statistics t on e.extension_name=t.column_name
and    t.table_name = :h;


 
-- Display extended statistics distinct values and histograms

column col_group format a30
 
select e.extension col_group,
       t.num_distinct,
       t.histogram
from   dba_stat_extensions e
       join dba_tab_col_statistics t on e.extension_name=t.column_name
and    t.table_name = :h;




Prompt Foreign Keys without Index

set lines 200  pages 200
set wrap off
column columns format a30 word_wrapped
column table_name format a30 word_wrapped
col COLUMNS_INDEXED for a20
col Status for a20
select decode( b.table_name, NULL, '****', 'ok' ) Status,   a.table_name, a.columns, b.columns columns_indexed
from 
( select substr(a.table_name,1,30) table_name, 
substr(a.constraint_name,1,30) constraint_name, 
     max(decode(position, 1,     substr(column_name,1,30),NULL)) || 
     max(decode(position, 2,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position, 3,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position, 4,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position, 5,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position, 6,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position, 7,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position, 8,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position, 9,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position,10,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position,11,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position,12,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position,13,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position,14,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position,15,', '||substr(column_name,1,30),NULL)) || 
     max(decode(position,16,', '||substr(column_name,1,30),NULL)) columns
    from all_cons_columns a, all_constraints b
   where 1=1 
  -- and a.owner=upper('POW')
    and a.table_name=:h
     and a.constraint_name = b.constraint_name
     and b.constraint_type = 'R'
   group by substr(a.table_name,1,30), substr(a.constraint_name,1,30) ) a, 
( select substr(table_name,1,30) table_name, substr(index_name,1,30) index_name, 
     max(decode(column_position, 1,     substr(column_name,1,30),NULL)) || 
     max(decode(column_position, 2,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position, 3,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position, 4,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position, 5,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position, 6,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position, 7,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position, 8,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position, 9,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position,10,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position,11,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position,12,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position,13,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position,14,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position,15,', '||substr(column_name,1,30),NULL)) || 
     max(decode(column_position,16,', '||substr(column_name,1,30),NULL)) columns
    from all_ind_columns 
    where  1=1
   -- and TABLE_OWNER=upper('POW')
    and table_name=:h
   group by substr(table_name,1,30), substr(index_name,1,30) ) b
where a.table_name = b.table_name (+)
  and b.columns (+) like a.columns || '%'
/




set linesize 300 
col TABLE_NAME for a30
col OWNER for a25
SELECT
   owner, 
   table_name, 
   TRUNC(sum(bytes)/1024/1024/1024) GB
   -- ,   ROUND( ratio_to_report( sum(bytes) ) over () * 100) Percent
FROM
(SELECT segment_name table_name, owner, bytes FROM dba_segments
 WHERE segment_type IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION')
 UNION ALL
 SELECT i.table_name, i.owner, s.bytes  FROM dba_indexes i, dba_segments s
 WHERE s.segment_name = i.index_name
 AND   s.owner = i.owner
 AND   s.segment_type IN ('INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION')
 UNION ALL
 SELECT l.table_name, l.owner, s.bytes FROM dba_lobs l, dba_segments s
 WHERE s.segment_name = l.segment_name
 AND   s.owner = l.owner
 AND   s.segment_type IN ('LOBSEGMENT', 'LOB PARTITION')
 UNION ALL
 SELECT l.table_name, l.owner, s.bytes FROM dba_lobs l, dba_segments s
 WHERE s.segment_name = l.index_name
 AND   s.owner = l.owner
 AND   s.segment_type = 'LOBINDEX')
WHERE 1=1
--and owner in ('XX')
and table_name =:h
GROUP BY table_name, owner
-- HAVING SUM(bytes)/1024/1024/1024 > 10  -- 1gb 
ORDER BY SUM(bytes) desc
;



set lines 300 set pages 300
col table_name for a40
col owner for a30 
select distinct owner, PARTITION_NAME,NUM_ROWS,table_name, STALE_STATS, last_analyzed, stattype_locked   from dba_tab_statistics
where 1=1
and table_name=:h
;


col anlyzd_rows form 99999,999,999
col tot_rows form 99999,999,999
col tab_name form a45
col chngs form 99,999,999,999
col pct_c form 9999999990.99
col truncated head 'Trun|cated' for a5 justify l
select dbta.owner||'.'||dbta.table_name tab_name
, dbta.num_rows anlyzd_rows
, to_char(dbta.last_analyzed,'yyyy-mm-dd hh24:mi:ss') last_anlzd
, nvl(dbta.num_rows,0)+nvl(dtm.inserts,0) -nvl(dtm.deletes,0) tot_rows
, nvl(dtm.inserts,0)+nvl(dtm.deletes,0)+nvl(dtm.updates,0) chngs
,(nvl(dtm.inserts,0)+nvl(dtm.deletes,0)+nvl(dtm.updates,0)) /greatest(nvl(dbta.num_rows,0),1) pct_c
, dtm.truncated
from dba_tab_statistics dbta
left outer join sys.dba_tab_modifications dtm
on dbta.owner = dtm.table_owner
and dbta.table_name = dtm.table_name
and dtm.partition_name is null
where 1=1
--and dbta.last_analyzed < sysdate - 1
--and STALE_STATS = 'YES'
and dbta.owner=:h
order by dbta.last_analyzed desc
;



col TABLE_OWNER for a30 
select TABLE_OWNER,table_name,inserts,updates,deletes,truncated,timestamp   from sys.dba_tab_modifications
  where 1=1
--and table_owner=user 
and table_name= :h
;



alter session set nls_date_format = 'DD-MON-YYYY HH24:MI:SS' ;
set linesize 300 pagesize 300
col TABLE_OWNER for a25
col NAME for a20
col IS_PARTITION for a15
select m.TABLE_OWNER,
'NO' as IS_PARTITION,
m.TABLE_NAME as NAME,
m.INSERTS,
m.UPDATES,
m.DELETES,
m.TRUNCATED,
m.TIMESTAMP as LAST_MODIFIED,
round((m.inserts+m.updates+m.deletes)*100/NULLIF(t.num_rows,0),2) as EST_PCT_MODIFIED,
t.num_rows as last_known_rows_number,
t.last_analyzed
From dba_tab_modifications m,dba_tables t
where m.table_owner=t.owner
and     m.table_name=t.table_name
and m.table_owner not in ('SYS','SYSTEM')
and ((m.inserts+m.updates+m.deletes)*100/NULLIF(t.num_rows,0) > 10 or t.last_analyzed is null)
and m.TABLE_NAME=:h
union
select m.TABLE_OWNER,
'YES' as IS_PARTITION,
m.PARTITION_NAME as NAME,
m.INSERTS,
m.UPDATES,
m.DELETES,
m.TRUNCATED,
m.TIMESTAMP as LAST_MODIFIED,
round((m.inserts+m.updates+m.deletes)*100/NULLIF(p.num_rows,0),2) as EST_PCT_MODIFIED,
p.num_rows as last_known_rows_number,
p.last_analyzed
From dba_tab_modifications m,dba_tab_partitions p
where m.table_owner=p.table_owner
and     m.table_name=p.table_name
and      m.PARTITION_NAME = p.PARTITION_NAME
and m.table_owner not in ('SYS','SYSTEM')
and ((m.inserts+m.updates+m.deletes)*100/NULLIF(p.num_rows,0) > 10 or p.last_analyzed is null)
and m.TABLE_NAME=:h
order by 8 desc
;




select command from
(select (nvl(a.updates,0)+nvl(a.inserts,0)+nvl(a.deletes,0))*100/ nvl(b.num_rows,1) as change,
   'exec DBMS_STATS.GATHER_TABLE_STATS (' || '''' || a.TABLE_OWNER || '''' || ',' || '''' || a.TABLE_NAME|| '''' || ', granularity => ' || '''' || 'PARTITION' || ''''||  ', PARTNAME => ' || '''' ||  a.PARTITION_NAME || '''' || ', ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE, METHOD_OPT=> ' || '''' || 'FOR ALL COLUMNS SIZE AUTO' || '''' || ') ;' as command
from dba_tab_modifications a, dba_tab_partitions b
  where 1=1
 -- and a.table_name = :h
  and a.table_name = b.table_name
  and a.partition_name = b.partition_name
  and nvl(a.updates,0)+nvl(a.inserts,0)+nvl(a.deletes,0) > 0
  )
  where change >= 10
  


  Best Method to Gather Stats of Partition Tables When Using Granularity (Doc ID 2352723.1)
  exec dbms_stats.gather_table_stats(ownname=>'AAA',tabname=>'BBB',partname=>'CCC',granularity=>'PARTITION',CASCADE=> true,estimate_percent=>dbms_stats.auto_sample_size,degree=>dbms_stats.auto_degree);

  
  (or)
exec dbms_stats.gather_table_stats (ownname=>'AAA',tabname=>'BBB',granularity =>'GLOBAL',CASCADE=> true,estimate_percent=>dbms_stats.auto_sample_size,degree=>dbms_stats.auto_degree);





-- from web 
set linesize 300 pagesize 300
col schema_name for a15
col column_name for a15
col default_value for a20
col table_name for a25
col comments for a20
col data_type_ext for a20 
col data_type for a20
select /*+ PARALLEL(4) */ col.owner as schema_name,
       col.table_name, 
       col.column_name, 
       col.data_type,
       decode(char_length,   0, data_type,  data_type || '(' || char_length || ')') as data_type_ext,
       col.data_length, 
       col.data_precision,  
       col.data_scale,  
       col.nullable, 
       col.data_default as default_value,
       nvl(pk.primary_key, ' ') as primary_key, 
       nvl(fk.foreign_key, ' ') as foreign_key, 
       nvl(uk.unique_key, ' ') as unique_key, 
       nvl(check_const.check_constraint, ' ') check_constraint,
       comm.comments
  from all_tables tab
       inner join all_tab_columns col 
           on col.owner = tab.owner 
          and col.table_name = tab.table_name    
       left join all_col_comments comm  on col.owner = comm.owner
          and col.table_name = comm.table_name 
          and col.column_name = comm.column_name 
       left join (select constr.owner, col_const.table_name,col_const.column_name, 'PK' primary_key
                    from all_constraints constr 
                         inner join all_cons_columns col_const  on constr.constraint_name = col_const.constraint_name 
                            and col_const.owner = constr.owner
                   where constr.constraint_type = 'P') pk
           on col.table_name = pk.table_name 
          and col.column_name = pk.column_name
          and col.owner = pk.owner
       left join (select constr.owner, col_const.table_name,col_const.column_name, 'FK' foreign_key
                    from all_constraints constr
                         inner join all_cons_columns col_const  on constr.constraint_name = col_const.constraint_name 
                            and col_const.owner = constr.owner 
                   where constr.constraint_type = 'R'
                   group by constr.owner, 
                            col_const.table_name, 
                            col_const.column_name) fk
           on col.table_name = fk.table_name 
          and col.column_name = fk.column_name
          and col.owner = fk.owner
       left join (select constr.owner,   col_const.table_name,  col_const.column_name, 'UK' unique_key
                    from all_constraints constr
                         inner join all_cons_columns col_const   on constr.constraint_name = col_const.constraint_name 
                            and constr.owner = col_const.owner
                   where constr.constraint_type = 'U' 
                   union
                  select ind.owner,   col_ind.table_name, col_ind.column_name,  'UK' unique_key
                    from all_indexes ind
                         inner join all_ind_columns col_ind  on ind.index_name = col_ind.index_name                  
                   where ind.uniqueness = 'UNIQUE') uk
           on col.table_name = uk.table_name 
          and col.column_name = uk.column_name
          and col.owner = uk.owner
       left join (select constr.owner,   col_const.table_name, col_const.column_name, 'Check' check_constraint
                    from all_constraints constr 
                         inner join all_cons_columns col_const   on constr.constraint_name = col_const.constraint_name 
                         and col_const.owner = constr.owner
                   where constr.constraint_type = 'C'
                   group by constr.owner, col_const.table_name,  col_const.column_name) check_const
           on col.table_name = check_const.table_name 
          and col.column_name = check_const.column_name      
          and col.owner = check_const.owner
 where 1=1
/* and col.owner not in ('ANONYMOUS','CTXSYS','DBSNMP','EXFSYS',
'LBACSYS', 'MDSYS','MGMT_VIEW','OLAPSYS','OWBSYS','ORDPLUGINS',
'ORDSYS','OUTLN', 'SI_INFORMTN_SCHEMA','SYS','SYSMAN','SYSTEM',
'TSMSYS','WK_TEST','WKSYS', 'WKPROXY','WMSYS','XDB','APEX_040000',
'APEX_PUBLIC_USER','DIP', 'FLOWS_30000','FLOWS_FILES','MDDATA',
'ORACLE_OCM','SPATIAL_CSW_ADMIN_USR', 'SPATIAL_WFS_ADMIN_USR',
'XS$NULL','PUBLIC')
*/
--  and col.owner = 'XX' 
--  and lower(tab.table_name) like '%'   
and tab.table_name=:h
order by col.owner,col.table_name,  col.column_name;
   
  




set lines 300 set pages 300
col table_name for a40
col owner for a30 
select owner,table_name,stats_update_time  from dba_tab_stats_history  where table_name = :h


SELECT TABLES.OWNER, TABLES.TABLE_NAME, ROUND((DELETES + UPDATES + INSERTS)/NUM_ROWS*100) PERCENTAGE FROM DBA_TABLES TABLES, DBA_TAB_MODIFICATIONS MODIFICATIONS
WHERE TABLES.OWNER = MODIFICATIONS.TABLE_OWNER
AND TABLES.TABLE_NAME = MODIFICATIONS.TABLE_NAME 
AND NUM_ROWS > 0
AND ROUND ( (DELETES + UPDATES + INSERTS) / NUM_ROWS * 100) >= 10
and TABLES.OWNER=:h
ORDER BY 3 desc



PROMPT 
PROMPT +----------------------------------------------------------------------------+
PROMPT | PARTITIONS (INDEX)                                                         |
PROMPT +----------------------------------------------------------------------------+

col  index_name              for A25       HEADING "Index Name"
col  partitioning_type       for A9        HEADING "Type"
col  partition_count         for 99999     HEADING "Part.|Count"
col  partitioning_key_count  for 99999     HEADING "Part.|Key Count"
col  locality                for A8        HEADING "Locality"
col  alignment               for A12       HEADING "Alignment"

SELECT
    a.owner || '.' || a.index_name   index_name
  , b.column_name
  , a.partitioning_type
  , a.partition_count
  , a.partitioning_key_count
  , a.locality
  , a.alignment
FROM     dba_part_indexes  a , dba_part_key_columns  b
WHERE 1=1      
  AND a.table_name         = :h
  AND RTRIM(b.object_type) = 'INDEX'
  AND b.owner              = a.owner
  AND b.name               = a.index_name
ORDER BY     a.index_name  , b.column_position
/



PROMPT 
PROMPT +----------------------------------------------------------------------------+
PROMPT | TRIGGERS                                                                   |
PROMPT +----------------------------------------------------------------------------+

col  trigger_name            for A25       HEADING "Trigger Name"
col  trigger_type            for A18       HEADING "Type"
col  triggering_event        for A9        HEADING "Trig.|Event"
col  referencing_names       for A65       HEADING "Referencing Names" newline
col  when_clause             for A65       HEADING "When Clause" newline
col  trigger_body            for A65       HEADING "Trigger Body" newline

SELECT
    owner || '.' || trigger_name  trigger_name
  , trigger_type
  , triggering_event
  , status
  , referencing_names
  , when_clause
  , trigger_body
FROM   dba_triggers
WHERE 1=1
 AND table_name  = :h
ORDER BY  trigger_name
/



set linesize 300 pagesize 300
col table_name for a25
col referencing_object for a20 
select referenced_owner || '.' || referenced_name as table_name, referenced_type as type,  owner || '.' || name as referencing_object,   type as referencing_type
from sys.all_dependencies
where referenced_type in('TABLE', 'VIEW')
      and referenced_name = :h -- put your table or view 
      --and referenced_owner = 'schema name'
      and owner not in ('ANONYMOUS','CTXSYS','DBSNMP','EXFSYS','MDSYS', 'MGMT_VIEW','OLAPSYS','OWBSYS','ORDPLUGINS', 'ORDSYS',
      'SI_INFORMTN_SCHEMA','SYS','SYSMAN','SYSTEM', 'TSMSYS','WK_TEST','WKPROXY','WMSYS','XDB','APEX_040000', 'APEX_PUBLIC_USER','DIP',
'FLOWS_30000','FLOWS_FILES','MDDATA', 'ORACLE_OCM', 'XS$NULL', 'SPATIAL_CSW_ADMIN_USR', 'SPATIAL_WFS_ADMIN_USR', 'PUBLIC','OUTLN', 'WKSYS',  'LBACSYS') 
order by referencing_object;



set linesize 300 pagesize 300
col object_name for a15
col owner       for a12
col kill info   for a15
select ''''||s.sid ||','|| s.serial#||',@'||s.inst_id ||'''' kill ,t.start_scnw,t.start_scnb
,t.start_time -- <<<<--- format mm/dd/yy 
,s.username, o.object_name,o.owner,t.used_ublk ,t.used_urec ,s.event,s.sql_id,s.prev_sql_id,s.status 
from gv$transaction t, gv$session s, gv$locked_object l,dba_objects o 
where 1=1 
and t.ses_addr  = s.saddr 
and t.inst_id   = s.inst_id 
and t.xidusn    = l.xidusn 
and t.xidslot   = l.xidslot 
and t.xidsqn    = l.xidsqn 
and t.inst_id   = l.inst_id 
and l.object_id = o.object_id 
-- and username not in ( 'SYS' , 'SYSTEM' , 'DBSNMP' , 'SYSMAN' , 'OUTLN' , 'MDSYS' , 'ORDSYS' , 'EXFSYS' , 'DMSYS' , 'WMSYS' , 'CTXSYS' , 'ANONYMOUS' , 'XDB' , 'ORDPLUGINS' , 'OLAPSYS' , 'PUBLIC','WWV_FLOW_PLATFORM' )
-- and s.STATUS!='INACTIVE'
-- l.object_id IN ('') ----< OBJECT ID FROM DBA_OBJECTS
and o.object_name=:h
;


--desc table 

COLUMN column_name         FORMAT A20                HEADING "Column Name"
COLUMN data_type           FORMAT A25                HEADING "Data Type"
COLUMN nullable            FORMAT A13                HEADing "Null?"

SELECT
    column_name
  , DECODE(nullable, 'Y', ' ', 'NOT NULL') nullable
  , DECODE(data_type
               , 'RAW',      data_type || '(' ||  data_length || ')'
               , 'CHAR',     data_type || '(' ||  data_length || ')'
               , 'VARCHAR',  data_type || '(' ||  data_length || ')'
               , 'VARCHAR2', data_type || '(' ||  data_length || ')'
               , 'NUMBER', NVL2(   data_precision
                                 , DECODE(    data_scale
                                            , 0
                                            , data_type || '(' || data_precision || ')'
                                            , data_type || '(' || data_precision || ',' || data_scale || ')'
                                   )
                                 , data_type)
               , data_type
    ) data_type
FROM
    dba_tab_columns
WHERE 1=1
 AND table_name = :h
ORDER BY   column_id
/


col owner        form a6 word wrap
col table_name   form a15 word wrap
col column_name  form a22 word wrap
col data_type    form a12
col M            form a1
col num_vals     form 99999,999
col dnsty        form 0.9999
col num_nulls    form 99999,999
col low_v        form a18
col hi_v         form a18
col data_type    form a10
set lines 110
break on owner nodup on table_name nodup

select --owner
--      ,table_name
      column_name
      ,data_type
      ,decode (nullable,'N','Y','N')  M
      ,num_distinct num_vals
      ,num_nulls
      ,density dnsty
,decode(data_type
  ,'NUMBER'       ,to_char(utl_raw.cast_to_number(low_value))
  ,'VARCHAR2'     ,to_char(utl_raw.cast_to_varchar2(low_value))
  ,'NVARCHAR2'    ,to_char(utl_raw.cast_to_nvarchar2(low_value))
  ,'BINARY_DOUBLE',to_char(utl_raw.cast_to_binary_double(low_value))
  ,'BINARY_FLOAT' ,to_char(utl_raw.cast_to_binary_float(low_value))
  ,'DATE',to_char(1780+to_number(substr(low_value,1,2),'XX')
         +to_number(substr(low_value,3,2),'XX'))||'-'
       ||to_number(substr(low_value,5,2),'XX')||'-'
       ||to_number(substr(low_value,7,2),'XX')||' '
       ||(to_number(substr(low_value,9,2),'XX')-1)||':'
       ||(to_number(substr(low_value,11,2),'XX')-1)||':'
       ||(to_number(substr(low_value,13,2),'XX')-1)
,  low_value
       ) low_v
,decode(data_type
  ,'NUMBER'       ,to_char(utl_raw.cast_to_number(high_value))
  ,'VARCHAR2'     ,to_char(utl_raw.cast_to_varchar2(high_value))
  ,'NVARCHAR2'    ,to_char(utl_raw.cast_to_nvarchar2(high_value))
  ,'BINARY_DOUBLE',to_char(utl_raw.cast_to_binary_double(high_value))
  ,'BINARY_FLOAT' ,to_char(utl_raw.cast_to_binary_float(high_value))
  ,'DATE',to_char(1780+to_number(substr(high_value,1,2),'XX')
         +to_number(substr(high_value,3,2),'XX'))||'-'
       ||to_number(substr(high_value,5,2),'XX')||'-'
       ||to_number(substr(high_value,7,2),'XX')||' '
       ||(to_number(substr(high_value,9,2),'XX')-1)||':'
       ||(to_number(substr(high_value,11,2),'XX')-1)||':'
       ||(to_number(substr(high_value,13,2),'XX')-1)
,  high_value
       ) hi_v
from dba_tab_columns
where 1=1
-- and owner      like upper('&tab_own')
--and   table_name like upper(nvl('&tab_name','OOPS')||'%')
AND table_name         = :h
ORDER BY owner,table_name,COLUMN_ID
/


-- ===============


alter session set nls_date_format='dd-MM-YYYY hh24:mi';
set linesize 300 pagesize 300
col owner for a20
col table_name  for a20
col index_name for a20
col TABLE_OWNER for a20
select owner,
   index_name,
   decode(INDEX_TYPE,
  'NORMAL',
  'B-tree',
  decode(index_type,
'BITMAP',
'BitMap',
decode(table_type,
'IOT',
'IOT',
decode(index_type, 'LOB', 'LOB')))) idx_type,
   table_owner,
   table_name,
   table_type,
   compression,
   status,
   blevel,
   clustering_factor,
   uniqueness,
   distinct_keys,
   last_analyzed,
   last_ddl_time
  from (select distinct t.INDEX_NAME,
t.OWNER,
t.index_type,
t.TABLE_OWNER,
t.TABLE_NAME,
decode(u.partitioned,
   'YES',
   'PART',
   decode(u.temporary,
  'Y',
  'TEMP',
  decode(u.iot_type,
'IOT',
'IOT',
'NORMAL'))) table_type,
t.compression,
t.status,
t.blevel,
t.clustering_factor,
t.distinct_keys,
t.uniqueness,
t.last_analyzed,
s.last_ddl_time
  from dba_indexes t, dba_objects s, dba_tables u
where t.index_name = s.object_name
   and u.table_name = t.table_name
   and s.owner = u.owner
   and t.owner = s.owner
   and s.object_type = 'INDEX'
  --  and t.owner = 'SYS'
--  and t.INDEX_NAME =''
and u.table_name=:h
order by t.index_name);


set linesize 300 pagesize 300 
col column_name for a20 
col subpartition_name  for a20 
col partition_name for a20
select t.table_owner,
   t.table_name,
   s.object_id,
   s.OBJECT_TYPE,
   'part tab' as part_role,
   s.DATA_OBJECT_ID,
   t.partition_name,
   t.subpartition_count,
   t.partition_position,
   t.CHAIN_CNT,
   trunc(((t.AVG_ROW_LEN * t.NUM_ROWS) / 8) / (decode(t.BLOCKS, 0, 1, t.BLOCKS)) * 100) as HWM_STAT,
   t.blocks,
   t.num_rows,
   t.avg_row_len,
   t.last_analyzed,
   s.LAST_DDL_TIME
  from dba_tab_partitions t, dba_objects s
 where t.partition_name = s.subobject_name
   and t.table_name = s.object_name
   and t.table_owner = s.owner
   and t.table_name not like '%BIN$%'
   and s.OBJECT_TYPE = 'TABLE PARTITION'
 --  and t.table_owner = 'SYS'
 and t.table_name =:h
 order by table_owner, table_name, partition_name
 ;
 



set linesize 300 pagesize 300 
col column_name for a20 
col subpartition_name  for a20 
col partition_name for a20
select t.table_owner,
   t.table_name,
   s.object_id,
   s.OBJECT_TYPE,
   'part tab son' as part_role,
   s.DATA_OBJECT_ID,
   t.partition_name,
   t.SUBPARTITION_NAME,
   t.SUBPARTITION_POSITION,
   u.column_name,
   t.CHAIN_CNT,
   t.blocks,
   t.num_rows,
   t.avg_row_len,
   trunc(((t.AVG_ROW_LEN * t.NUM_ROWS) / 8) / (decode(t.BLOCKS, 0, 1, t.BLOCKS)) * 100) as HWM_STAT,
   t.last_analyzed,
   s.LAST_DDL_TIME
  from dba_tab_subpartitions t, dba_objects s,dba_subpart_key_columns u
 where t.table_name = u.name
 and t.subpartition_name = s.subobject_name
   and t.table_name = s.object_name
   and t.table_owner = s.owner
   and t.table_name not like '%BIN$%'     
   and s.OBJECT_TYPE = 'TABLE SUBPARTITION'
  -- and t.table_owner = 'SYS'
  and t.table_name =:h 
 order by table_owner, table_name, partition_name
 ;


set linesize 300 pagesize 300 
col column_name for a20 
col subpartition_name  for a20 
col partition_name for a20
select t.table_owner,
   t.table_name,
   s.object_id,
   s.OBJECT_TYPE,
   'part tab son' as part_role,
   s.DATA_OBJECT_ID,
   t.partition_name,
   t.SUBPARTITION_NAME,
   t.SUBPARTITION_POSITION,
   u.column_name,
   t.CHAIN_CNT,
   t.blocks,
   t.num_rows,
   t.avg_row_len,
   trunc(((t.AVG_ROW_LEN * t.NUM_ROWS) / 8) / (decode(t.BLOCKS, 0, 1, t.BLOCKS)) * 100) as HWM_STAT,
   t.last_analyzed,
   s.LAST_DDL_TIME
  from dba_tab_subpartitions t, dba_objects s,Dba_Subpart_Key_Columns u
 where t.table_name = u.name
 and t.subpartition_name = s.SUBOBJECT_NAME
   and t.table_name = s.object_name
   and t.table_owner = s.owner
   and t.table_name not like '%BIN$%'     
   and s.OBJECT_TYPE = 'TABLE SUBPARTITION'
   --and t.table_owner = 'SYS'
   and t.table_name =:h 
 order by table_owner, table_name, partition_name;
 ;


set linesize 300 pagesize 300 
col column_name for a20 
col subpartition_name  for a20 
col partition_name for a20
col IOT_NAME for a15
   select t.owner,
   t.table_name,
   decode(t.partitioned,
  'YES',
  'PART',
  decode(t.temporary, 'Y', 'TEMP', decode (t.iot_type,'IOT','IOT','NORMAL'))) table_type,
   s.object_type,
   t.iot_name,
   t.NUM_ROWS,
   t.BLOCKS,
   t.AVG_ROW_LEN,
   t.LAST_ANALYZED,
   s.last_ddl_time,
   t.CHAIN_CNT,
   trunc(((t.AVG_ROW_LEN * t.NUM_ROWS) / 8) / (decode(t.BLOCKS, 0, 1, t.BLOCKS)) * 100) as HWM_STAT,
   t.COMPRESSION
  from dba_tables t, dba_objects s
where t.table_name = s.object_name
   and t.owner = s.owner
   and s.object_type = 'TABLE'
   and t.table_name not like '%BIN%'
    and t.table_name =:h 
--  and t.owner = 'obj_owner'
;


set linesize 300 pagesize 300 
col column_name for a20 
col subpartition_name  for a20 
col partition_name for a20
col iot_name for a15  
select t.owner,
   t.index_name,
   t.table_name,
   u.partition_name,
   u.partition_position,       
   v.column_name,
   t.partitioning_type,
   t.subpartitioning_type,
   t.partition_count,
   t.locality,
   t.alignment,
   u.compression,
   u.status,
   u.blevel,
   u.clustering_factor,
   u.distinct_keys,
   u.last_analyzed
  from dba_part_indexes t, dba_ind_partitions u,dba_part_key_columns v
 where t.index_name = u.index_name
   and t.index_name = v.name
   and t.owner = u.index_owner
  -- and t.owner = 'obj_owner'
  and t.TABLE_NAME=:h 
 order by u.index_name,u.partition_name
 ;
 

select s.segment_name,
       t.partition_name,
       s.partition_name,
       sum(s.bytes) / 1024 / 1024 as tab_space
  from dba_segments s, dba_tab_subpartitions t
 where s.partition_name = t.subpartition_name
   and s.segment_type = 'TABLE SUBPARTITION'
   and s.owner = t.table_owner
  -- and s.owner = :owner
  AND    table_name =:h
 group by s.owner, s.segment_name,t.partition_name,s.partition_name;




set linesize 300
select owner, table_name, num_rows, blocks, empty_blocks, avg_space, chain_cnt, avg_row_len 
from dba_tables 
where table_name=:h
;

---------------------------------------------------------------------

col MB for 999,999,999.99

set linesize 300
SELECT owner, table_name, NVL(num_rows*avg_row_len,0)/1024000 MB FROM dba_tables 
where 1=1
and table_name=:h
ORDER BY owner, table_name;

---------------------------------------------------------------------

col ALLOCATED_MB for 999,999,999.99
col REQUIRED_MB for 999,999,999.99
col TABLE_NAME for a20
col TABLESPACE_NAME for a20
SELECT SUBSTR(s.segment_name,1,20) TABLE_NAME,
SUBSTR(s.tablespace_name,1,20) TABLESPACE_NAME,
ROUND(DECODE(s.extents, 1, s.initial_extent,(s.initial_extent + (s.extents-1) * s.next_extent))/1024000,2) ALLOCATED_MB,ROUND((t.num_rows * t.avg_row_len / 1024000),2) REQUIRED_MB
FROM dba_segments s, dba_tables t
WHERE s.owner = t.owner
AND s.segment_name = t.table_name
-- and t.owner='TEST'
and t.table_name=:h
ORDER BY ALLOCATED_MB;

col segment_name for a32
select segment_name, substr(s.segment_name,1,20) table_name,substr(s.tablespace_name,1,20) tablespace_name,
round(decode(s.extents, 1, s.initial_extent,(s.initial_extent + (s.extents-1) * s.next_extent))/1048576,2) allocated_mb, 
bytes/(1024*1024) m,segment_type 
from dba_segments s
where 1=1 
--and segment_name like 'accountrat%'
and segment_name =:h
--and t.owner=:h
order by allocated_mb;

select owner, table_name, TABLESPACE_NAME, ROUND((t.num_rows * t.avg_row_len / 1048576),2) REQUIRED_MB 
from dba_tables t
where 1=1
--and owner= 'TEST'
and table_name=:h
;



set lines 200 pages 200
col value for 999,999,999,999.99
col STATISTIC_NAME for a30
col OWNER for a12
col OBJECT_TYPE for a10

select *
from
  (select statistic_name,
     st.owner,
     st.obj#,
     st.object_type,
     st.object_name,
     st.value,
     dense_rank() over(partition by statistic_name
   order by st.value desc) rnk
   from gv$segment_statistics st)
where rnk <= 10
and object_name=:h
;

 ---Table size 

set linesize 200 pagesize 200
col partition_name for a20
col segment_name for a30
col owner for  a20
select owner, segment_name, segment_type, partition_name, tablespace_name , round(bytes/(1024*1024*1024),2) size_gb
from dba_segments 
where 1=1 
and segment_type in ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION','INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION', 'TEMPORARY', 'LOBINDEX', 'LOBSEGMENT', 'LOB PARTITION')
--AND segment_type = 'TABLE'
 and segment_name=:h
-- AND ROUND(bytes/(1024*1024*1024),2) > 10  --- 10gb 
--and segment_name in  ('XXXX')
ORDER BY bytes DESC;



set linesize 300 pagesize 300
col SEGMENT_NAME  format a40
col PARTITION_NAME for a20
col TABLE_NAME for a30
col TABLESPACE_NAME for a20
select s.segment_name,TABLE_NAME, s.partition_name, bytes/1024/1024/1024 "Size (GB)",s.TABLESPACE_NAME
from dba_segments s, dba_lobs l
 where s.segment_name = l.segment_name
-- and s.segment_name not like 'SYS%'
 --and s.owner ='OBX'
 --and s.segment_name in ('SYS_LOB0001163662C00007$$','SYS_LOB0001720371C00012$$' ,'SYS_LOB0001720358C00009$$','OBI.SYS_LOB0001163644C00007$$')
  and s.segment_name= :h
 order by s.segment_name, s.partition_name;



set linesize 500
col securefile for a15
col owner for a20
select distinct e.owner,l.table_name,l.segment_name,encrypt,compression,deduplication,format,securefile,retention_type,retention_value from dba_extents e, dba_lobs l
where e.owner = l.owner
and e.segment_name = l.segment_name
--and e.segment_type = 'LOBSEGMENT'
--and l.segment_name like 'SYS_LOB0000C00014$$'
and l.table_name=:h
order by 1
;


set linesize 300 pagesize 300
col owner for a20
col column_name for a20
col segment_name for a30
col TABLE_NAME for a30
col TABLESPACE_NAME for a30
SELECT owner
, table_name
, column_name
, segment_name
,securefile
,TABLESPACE_NAME
FROM dba_lobs
WHERE 1=1
AND segment_name IN (
                     SELECT segment_name
                     FROM dba_segments
                     WHERE 1=1
                     AND owner = 'ANUJ'  ----<<<<
                     AND segment_type = 'LOBSEGMENT' -- or LOB SUBPARTITION, LOBINDEX, LOB PARTITION
                     )


col OWNER for a12
col OBJECT_NAME for a30
col OBJECT_TYPE for a14
col SUBOBJECT_NAME for a30
SELECT ob.owner, ob.object_name, ob.subobject_name, ob.object_type,obj#, savtime, flags, rowcnt, blkcnt, avgrln ,samplesize, analyzetime, cachedblk, cachehit, logicalread
FROM sys.WRI$_OPTSTAT_TAB_HISTORY, dba_objects ob
WHERE 1=1 --and owner=upper('OWNER')
and object_name=:h
and object_type in ('TABLE')
and object_id=obj#
order by savtime asc;





COLUMN     tab_column_name           FORMAT A30              HEADING 'Column Name'
COLUMN     tab_column_datatype       FORMAT A20              HEADING 'Datatype'
COLUMN     tab_column_nullable       FORMAT A10              HEADING 'Nullable?'
COLUMN     tab_column_numdistinct    FORMAT 999,999,999      HEADING 'Distinct|Values'
COLUMN     tab_column_density        FORMAT 9.99999          HEADING 'Density'
COLUMN     tab_column_numnulls       FORMAT 999,999,999      HEADING 'Number|of Nulls'
COLUMN     tab_column_histogram      FORMAT A16              HEADING 'Histogram'
COLUMN     tab_column_numbuckets     FORMAT 999,999          HEADING 'Buckets'

SELECT     i.index_name                                    ind_name,
           i.status                                        ind_status,
           DECODE(i.uniqueness,'UNIQUE','Y',NULL)          ind_unique,
           i.blevel                                        ind_blevel,
           i.leaf_blocks                                   ind_leafblocks,
           i.num_rows                                      ind_numrows,
           i.distinct_keys                                 ind_distinctkeys,
           i.clustering_factor                             ind_clufac,
           TO_CHAR(i.last_analyzed, 'DD/MM/YYYY hh24:mi')  last_analyzed_time
FROM       dba_indexes i
WHERE      i.table_name = :h
ORDER BY   i.uniqueness DESC, i.index_name
/




-- from https://github.com/macartain/sql/blob/master/get_table_index_info.sql


set linesize 300 pagesize 300
COLUMN   index_name  FORMAT A30 HEADING 'Index Name'
COLUMN   column_name FORMAT A30 HEADING 'Column Name'
COLUMN   low_value   FORMAT A20 HEADING 'Low Value'
COLUMN   high_value  FORMAT A20 HEADING 'High Value'

BREAK ON index_name NODUP

WITH col_hi_lo_vals AS
( select     tc.column_name
        ,    tc.data_type
        ,    tc.low_value raw_low_value
        ,    tc.high_value raw_high_value
        ,    SUBSTR(dump(tc.low_value), (INSTR(dump(tc.low_value),': ')+2)) date_low_val
        ,    SUBSTR(dump(tc.high_value), (INSTR(dump(tc.high_value),': ')+2)) date_high_val   
  from       dba_tab_columns tc
  WHERE      tc.table_name = :h
),
col_hi_lo_vals_translated AS
( SELECT     column_name
         ,   data_type
         ,   CASE when data_type = 'DATE'
             THEN 
                  TO_CHAR(REGEXP_SUBSTR(date_low_val, '[0-9]+',1,1)-100, '09')|| -- low_century 
                  TO_CHAR(REGEXP_SUBSTR(date_low_val, '[0-9]+',1,2)-100, '09')|| -- low_year
                  TO_CHAR(REGEXP_SUBSTR(date_low_val, '[0-9]+',1,3),'09')|| --      low_month     
                  TO_CHAR(REGEXP_SUBSTR(date_low_val, '[0-9]+',1,4),'09')|| --      low_day     
                  TO_CHAR(REGEXP_SUBSTR(date_low_val, '[0-9]+',1,5)-1,'09')|| --      low_hour24     
                  TO_CHAR(REGEXP_SUBSTR(date_low_val, '[0-9]+',1,6)-1,'09')|| --      low_minute     
                  TO_CHAR(REGEXP_SUBSTR(date_low_val, '[0-9]+',1,7)-1,'09')   --      low_second
             ELSE
                 NULL
             END low_date
         ,   CASE when data_type = 'DATE'
             THEN 
                  TO_CHAR(REGEXP_SUBSTR(date_high_val, '[0-9]+',1,1)-100, '09')|| -- high_century
                  TO_CHAR(REGEXP_SUBSTR(date_high_val, '[0-9]+',1,2)-100, '09')|| -- high_year
                  TO_CHAR(REGEXP_SUBSTR(date_high_val, '[0-9]+',1,3), '09')|| --     high_month     
                  TO_CHAR(REGEXP_SUBSTR(date_high_val, '[0-9]+',1,4), '09')|| --     high_day
                  TO_CHAR(REGEXP_SUBSTR(date_high_val, '[0-9]+',1,5)-1, '09')|| --     high_hour24
                  TO_CHAR(REGEXP_SUBSTR(date_high_val, '[0-9]+',1,6)-1, '09')|| --     high_minute 
                  TO_CHAR(REGEXP_SUBSTR(date_high_val, '[0-9]+',1,7)-1, '09')   --     high_second     
             ELSE
                  NULL
             END high_date
         ,   CASE WHEN data_type = 'NUMBER'
                  THEN
                       utl_raw.cast_to_number(raw_low_value)
             ELSE
                  NULL
             END low_num
         ,   CASE WHEN data_type = 'NUMBER'
                  THEN
                       utl_raw.cast_to_number(raw_high_value)
             ELSE
                  NULL
             END high_num           
         ,   CASE WHEN data_type LIKE '%CHAR%'
                  THEN
                       utl_raw.cast_to_varchar2(raw_low_value)
             ELSE
                  NULL
             END low_char
         ,   CASE WHEN data_type LIKE '%CHAR%'
                  THEN
                       utl_raw.cast_to_varchar2(raw_high_value)
             ELSE
                  NULL
             END high_char           
FROM         col_hi_lo_vals
)
SELECT     ic.index_name,
           ic.column_name
      ,    CASE WHEN chlvt.data_type = 'DATE'
                THEN TO_CHAR(TO_DATE(REPLACE(chlvt.low_date, ' '), 'YYYYMMDDHH24MISS'), 'MM/DD/YYYY hh24:mi:ss')
                WHEN chlvt.data_type = 'NUMBER'
                THEN LPAD(TO_CHAR(chlvt.low_num),20)
                WHEN chlvt.data_type LIKE '%CHAR%'
                THEN chlvt.low_char
           END low_value
      ,    CASE WHEN chlvt.data_type = 'DATE'
                THEN TO_CHAR(TO_DATE(REPLACE(chlvt.high_date, ' '), 'YYYYMMDDHH24MISS'), 'MM/DD/YYYY hh24:mi:ss')
                WHEN chlvt.data_type = 'NUMBER'
                THEN LPAD(TO_CHAR(chlvt.high_num),20)
                WHEN chlvt.data_type LIKE '%CHAR%'
                THEN chlvt.high_char
           END high_value           
FROM       dba_ind_columns ic
      ,    col_hi_lo_vals_translated chlvt
WHERE      ic.table_name = :h
  AND      ic.column_name = chlvt.column_name
ORDER BY   ic.index_name, ic.column_position
/



Prompt Table metadata ...

SET LONG 10000 LONGCHUNKSIZE 10000 PAGESIZE 0 LINESIZE 1000 FEEDBACK OFF VERIFY OFF TRIMSPOOL ON
BEGIN
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'SQLTERMINATOR', true);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'PRETTY', true);
END;
/

SELECT DBMS_METADATA.get_ddl ('TABLE', table_name, owner)
FROM   all_tables
WHERE 1=1   
-- and owner      = UPPER('1')
AND    table_name = :h;

set PAGESIZE 80

****



var h varchar2(30)
 begin :h := 'TEST'; end;  ---- table name here!!!!
/

set heading off  echo off pages 999  long 90000 

exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',true);

var h varchar2(30)
 begin :h := 'TEST'; end;  ---- table name here!!!!
/

var O varchar2(30)
 begin :O := 'ANUJ'; end;  ---- table owner here!!!!
/

set heading off  echo off pages 999  long 90000 

exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',true);


SELECT DBMS_METADATA.get_ddl ('TABLE', table_name, owner)
FROM   all_tables
WHERE 1=1   
 --and owner      = :O
AND    table_name = :h;



SELECT DBMS_METADATA.get_ddl ('INDEX', INDEX_NAME, owner)
FROM   all_indexes
WHERE 1=1   
--and owner      = :O
AND    table_name = :h;



select dbms_metadata.get_dependent_ddl('CONSTRAINT', table_name, owner)
FROM   all_tables
WHERE 1=1   
--and owner      = :O
AND    table_name = :h;


select dbms_metadata.get_dependent_ddl('TRIGGER', table_name, owner)
FROM   all_tables
WHERE 1=1   
-- and owner      = :O
AND    table_name = :h;


==============


GATHER_TABLE_STATS for stale stats 

set linesize 300 pagesize 300
col gather_stats for a200
select 'EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'''||owner||''', tabname=>'''||table_name||''',estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => ''FOR ALL COLUMNS SIZE AUTO'', degree=>16,cascade=>true);' gather_stats
from dba_tables t
where 1=1
and owner='XXX' 
--and PARTITIONED='NO' 
--and LAST_ANALYZED<sysdate-4
and t.TABLE_NAME in (select TABLE_NAME from DBA_TAB_STATISTICS where STALE_STATS='YES' 
and OWNER='XX'
)
;



gather stats ... 

define tabname='EMP'
define owner='ANUJ'

set pages 100 lines 250
--set echo off feedback off heading on 
col gather for a200
spool gather.sql
select 'SET ECHO ON FEEDBACK ON TIMING ON' FROM DUAL;
select 'exec dbms_stats.gather_table_stats (ownname => ''' || owner ||''', tabname => '''||table_name||''' , estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE , cascade => TRUE,method_opt => '''||' FOR ALL COLUMNS SIZE AUTO'''||' , degree => 8);' gather  from   dba_tables
where table_name in ('&&tabname')
and OWNER='&&owner'
;


or



BEGIN
for i in (select OWNER,TABLE_NAME from DBA_TAB_STATISTICS  where STALE_STATS='YES' and OWNER='ANUJ'
         ) loop
  SYS.DBMS_STATS.GATHER_TABLE_STATS (
     ownname          => i.OWNER
    ,TabName           => i.TABLE_NAME
    ,Estimate_Percent  => SYS.DBMS_STATS.AUTO_SAMPLE_SIZE
    ,Method_Opt        => 'FOR ALL COLUMNS SIZE AUTO '
    ,Degree            => NULL
    ,Cascade           => DBMS_STATS.AUTO_CASCADE
    ,No_Invalidate     => DBMS_STATS.AUTO_INVALIDATE
    ,Force             => FALSE);
end loop;
END;
/



ww
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname    => 'ANUJ',tabname    => 'T100', degree => DBMS_STATS.AUTO_DEGREE,cascade => DBMS_STATS.AUTO_CASCADE, method_opt => 'FOR ALL COLUMNS SIZE AUTO',estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE);

====


change table name

set linesize 100 pagesize 300
define tabname='EMP'
define owner='ANUJ'

select rpad('ANDV_ALGO_INTERNAL_OBSERVE : ',50)||dbms_stats.get_prefs(pname=>'ANDV_ALGO_INTERNAL_OBSERVE', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('APPROXIMATE_NDV : ',50)||dbms_stats.get_prefs(pname=>'APPROXIMATE_NDV', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('APPROXIMATE_NDV_ALGORITHM : ',50)||dbms_stats.get_prefs(pname=>'APPROXIMATE_NDV_ALGORITHM', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('AUTO_STAT_EXTENSIONS : ',50)||dbms_stats.get_prefs(pname=>'AUTO_STAT_EXTENSIONS', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('AUTOSTATS_TARGET : ',50)||dbms_stats.get_prefs(pname=>'AUTOSTATS_TARGET', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('CASCADE : ',50)||dbms_stats.get_prefs(pname=>'CASCADE', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('CONCURRENT : ',50)||dbms_stats.get_prefs(pname=>'CONCURRENT', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('DEBUG : ',50)||dbms_stats.get_prefs(pname=>'DEBUG', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('DEGREE : ',50)||dbms_stats.get_prefs(pname=>'DEGREE', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('ENABLE_HYBRID_HISTOGRAMS : ',50)||dbms_stats.get_prefs(pname=>'ENABLE_HYBRID_HISTOGRAMS', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('ENABLE_TOP_FREQ_HISTOGRAMS : ',50)||dbms_stats.get_prefs(pname=>'ENABLE_TOP_FREQ_HISTOGRAMS', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('ESTIMATE_PERCENT : ',50)||dbms_stats.get_prefs(pname=>'ESTIMATE_PERCENT', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('GATHER_AUTO : ',50)||dbms_stats.get_prefs(pname=>'GATHER_AUTO', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('GATHER_SCAN_RATE : ',50)||dbms_stats.get_prefs(pname=>'GATHER_SCAN_RATE', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('GLOBAL_TEMP_TABLE_STATS : ',50)||dbms_stats.get_prefs(pname=>'GLOBAL_TEMP_TABLE_STATS', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('GRANULARITY : ',50)||dbms_stats.get_prefs(pname=>'GRANULARITY', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('INCREMENTAL : ',50)||dbms_stats.get_prefs(pname=>'INCREMENTAL', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('INCREMENTAL_INTERNAL_CONTROL : ',50)||dbms_stats.get_prefs(pname=>'INCREMENTAL_INTERNAL_CONTROL', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('INCREMENTAL_LEVEL : ',50)||dbms_stats.get_prefs(pname=>'INCREMENTAL_LEVEL', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('INCREMENTAL_STALENESS : ',50)||dbms_stats.get_prefs(pname=>'INCREMENTAL_STALENESS', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('JOB_OVERHEAD : ',50)||dbms_stats.get_prefs(pname=>'JOB_OVERHEAD', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('JOB_OVERHEAD_PERC : ',50)||dbms_stats.get_prefs(pname=>'JOB_OVERHEAD_PERC', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('METHOD_OPT : ',50)||dbms_stats.get_prefs(pname=>'METHOD_OPT', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('NO_INVALIDATE : ',50)||dbms_stats.get_prefs(pname=>'NO_INVALIDATE', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('OPTIONS : ',50)||dbms_stats.get_prefs(pname=>'OPTIONS', tabname=>'&&TABLE' ,ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('PREFERENCE_OVERRIDES_PARAMETER : ',50)||dbms_stats.get_prefs(pname=>'PREFERENCE_OVERRIDES_PARAMETER', tabname=>'&&TABLE' ,ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('PUBLISH : ',50)||dbms_stats.get_prefs(pname=>'PUBLISH', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('SCAN_RATE : ',50)||dbms_stats.get_prefs(pname=>'SCAN_RATE', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('STALE_PERCENT : ',50)||dbms_stats.get_prefs(pname=>'STALE_PERCENT', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('STAT_CATEGORY : ',50)||dbms_stats.get_prefs(pname=>'STAT_CATEGORY', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('SYS_FLAGS : ',50)||dbms_stats.get_prefs(pname=>'SYS_FLAGS', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('TABLE_CACHED_BLOCKS : ',50)||dbms_stats.get_prefs(pname=>'TABLE_CACHED_BLOCKS', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('TRACE : ',50)||dbms_stats.get_prefs(pname=>'TRACE', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
select rpad('WAIT_TIME_TO_UPDATE_STATS : ',50)||dbms_stats.get_prefs(pname=>'WAIT_TIME_TO_UPDATE_STATS', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE
-- 19c
--select rpad('AUTO_TASK_INTERVAL : ',50)||dbms_stats.get_prefs(pname=>'AUTO_TASK_INTERVAL', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
--select rpad('AUTO_TASK_MAX_RUN_TIME : ',50)||dbms_stats.get_prefs(pname=>'AUTO_TASK_MAX_RUN_TIME', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
--select rpad('AUTO_TASK_STATUS : ',50)||dbms_stats.get_prefs(pname=>'AUTO_TASK_STATUS', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
--select rpad('ROOT_TRIGGER_PDB : ',50)||dbms_stats.get_prefs(pname=>'ROOT_TRIGGER_PDB', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
--select rpad('COORDINATOR_TRIGGER_SHARD : ',50)||dbms_stats.get_prefs(pname=>'COORDINATOR_TRIGGER_SHARD', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
--select rpad('MAINTAIN_STATISTICS_STATUS : ',50)||dbms_stats.get_prefs(pname=>'MAINTAIN_STATISTICS_STATUS', tabname=>'&&TABLE',ownname => '&&owner') prefs_for__&&TABLE FROM dual UNION ALL
FROM dual;

PREFS_FOR__EMP
----------------------------------------------------------------------------------------------------
ANDV_ALGO_INTERNAL_OBSERVE :                      FALSE
APPROXIMATE_NDV :                                 TRUE
APPROXIMATE_NDV_ALGORITHM :                       REPEAT OR HYPERLOGLOG
AUTO_STAT_EXTENSIONS :                            OFF
AUTOSTATS_TARGET :                                AUTO
CASCADE :                                         DBMS_STATS.AUTO_CASCADE
CONCURRENT :                                      OFF
DEBUG :                                           0
DEGREE :                                          NULL
ENABLE_HYBRID_HISTOGRAMS :                        3
ENABLE_TOP_FREQ_HISTOGRAMS :                      3
ESTIMATE_PERCENT :                                DBMS_STATS.AUTO_SAMPLE_SIZE
GATHER_AUTO :                                     AFTER_LOAD
GATHER_SCAN_RATE :                                HADOOP_ONLY
GLOBAL_TEMP_TABLE_STATS :                         SESSION
GRANULARITY :                                     AUTO
INCREMENTAL :                                     FALSE
INCREMENTAL_INTERNAL_CONTROL :                    TRUE
INCREMENTAL_LEVEL :                               PARTITION
INCREMENTAL_STALENESS :                           ALLOW_MIXED_FORMAT
JOB_OVERHEAD :                                    -1
JOB_OVERHEAD_PERC :                               1
METHOD_OPT :                                      FOR ALL COLUMNS SIZE AUTO
NO_INVALIDATE :                                   DBMS_STATS.AUTO_INVALIDATE
OPTIONS :                                         GATHER
PREFERENCE_OVERRIDES_PARAMETER :                  FALSE
PUBLISH :                                         TRUE
SCAN_RATE :                                       0
STALE_PERCENT :                                   10
STAT_CATEGORY :                                   OBJECT_STATS
SYS_FLAGS :                                       1
TABLE_CACHED_BLOCKS :                             1
TRACE :                                           0
WAIT_TIME_TO_UPDATE_STATS :                       15

34 rows selected.



====

col owner for a20
col table_name for a20
col incremental  for a15
col granularity for a15
col stale_percent for a15
col estimate_percent for a30
col cascade for a30
col method_opt for a30
SELECT 
  owner, table_name,
  DBMS_STATS.get_prefs(ownname=>USER,tabname=>table_name,pname=>'INCREMENTAL') incremental,
  DBMS_STATS.get_prefs(ownname=>USER,tabname=>table_name,pname=>'GRANULARITY') granularity,
  DBMS_STATS.get_prefs(ownname=>USER,tabname=>table_name,pname=>'STALE_PERCENT') stale_percent,
  DBMS_STATS.get_prefs(ownname=>USER,tabname=>table_name,pname=>'ESTIMATE_PERCENT') estimate_percent,
  DBMS_STATS.get_prefs(ownname=>USER,tabname=>table_name,pname=>'CASCADE') cascade,
  DBMS_STATS.get_prefs(pname=>'METHOD_OPT') method_opt
FROM dba_tables
WHERE table_name like :h
order by owner, table_name;


OWNER                TABLE_NAME           INCREMENTAL     GRANULARITY     STALE_PERCENT   ESTIMATE_PERCENT               CASCADE                        METHOD_OPT
-------------------- -------------------- --------------- --------------- --------------- ------------------------------ ------------------------------ ------------------------------
ANUJ                 EMP                  FALSE           AUTO            10              DBMS_STATS.AUTO_SAMPLE_SIZE    DBMS_STATS.AUTO_CASCADE        FOR ALL COLUMNS SIZE AUTO
ANUJ1                EMP                  FALSE           AUTO            10              DBMS_STATS.AUTO_SAMPLE_SIZE    DBMS_STATS.AUTO_CASCADE        FOR ALL COLUMNS SIZE AUTO


exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
exec dbms_stats.set_table_prefs('SCOTT', EMP', 'STALE_PERCENT', '1');
EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMP');

exec dbms_stats.set_table_prefs('SCOTT', EMP', 'STALE_PERCENT', '10');


for trace


 ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
  ALTER SESSION SET EVENTS '10046 trace name context off';

=====

Stats info ...


define tab='EMP'
alter session set nls_date_format = 'DD-MON-YYYY HH24:MI:SS';

col INDEX_NAME for A20
col TABLE_NAME for A20
col COLUMN_NAME for A20
col OWNER for a20


select OWNER,table_name,stats_update_time     from dba_tab_stats_history     where table_name = '&tab'


-- tables

select table_name, last_analyzed analyze_time, num_rows, blocks, avg_row_len from dba_tables
where table_name = '&tab';

select OWNER,table_name, last_analyzed "analyze time", num_rows, blocks, avg_row_len from dba_tab_pending_stats
where table_name = '&tab' 
and partition_name is null;


-- indexes
select OWNER,index_name, last_analyzed ANALYZE_TIME, num_rows, leaf_blocks, distinct_keys from dba_indexes
where table_name = '&tab'
order by index_name;


select OWNER,table_name,index_name, last_analyzed "analyze time", num_rows, leaf_blocks, distinct_keys from dba_ind_pending_stats
where table_name = '&tab' 
and partition_name is null
order by index_name;

-- columns
select OWNER,table_name,column_name, last_analyzed ANALYZE_TIME, num_distinct,      num_nulls, density from dba_tab_columns
where table_name = '&tab'
order by OWNER,table_name,column_name;
 

select OWNER,table_name,column_name, last_analyzed "analyze time", num_distinct,  num_nulls, density from dba_col_pending_stats
where table_name = '&tab' 
and partition_name is null
order by column_name;

select OWNER,table_name,stats_update_time from dba_tab_stats_history  where table_name = '&tab';

====

define T_NAME='EMP'
set verify off

set linesize 300
set long 30

column constraint_name format a30
column constraint_type format a2 heading CT
column column_name format a30
column position format 99 heading CP
column r_owner format a30
column r_constraint_name format a30

break on constraint_name skip 1 on constraint_type

select con.constraint_name, con.constraint_type, con.status, con.r_owner, con.r_constraint_name, 
       col.column_name, col.position, con.search_condition
from dba_constraints con,
     dba_cons_columns col
where col.owner = con.owner
      and col.constraint_name = con.constraint_name
    --  and con.owner = 'T_OWNER'
      and con.table_name = '&T_NAME'
order by con.constraint_name, col.position;


====


-- any analysed tables with significant chaining
set pages 200  linesize 300

col table_name form a25 word wrap
col owner      form a15 word wrap
col num_rows   form 999,999,999
col chain_cnt  form 9,999,999
col pct_chn    form 99.99
--accept tab_name char prompt 'which tables are to be checked ? >'
prompt only works on analyzed tables/partitioned tables
--spool tab_chain.lst
select table_name
      ,owner
      ,num_rows
      ,chain_cnt
      ,(nvl(chain_cnt,1)/nvl(num_rows,1))*100 pct_chn
from sys.dba_tables
-- NB keep greatest for num_rows and  percentage in line else a table with
-- (in this case) less than 1000 rows will always be detected.
where greatest(nvl(chain_cnt,1),1) /greatest(nvl(num_rows,1),1000)   > 0.001
and table_name like upper(':h'||'%')
and owner not in ('SYS','SYSTEM')
union
select table_name||' '||partition_name table_name
      ,table_owner                     owner
      ,num_rows
      ,chain_cnt
      ,(nvl(chain_cnt,1)/nvl(num_rows,1))*100 pct_chn
from sys.dba_tab_partitions
-- NB keep greatest for num_rows and  percentage in line else a table with
-- (in this case) less than 1000 rows will always be detected.
where greatest(nvl(chain_cnt,1),1) /greatest(nvl(num_rows,1),1000)   > 0.001
and table_name like upper(':h'||'%')
and table_owner not in ('SYS','SYSTEM')
order by 1,2
/
--spool off
clear colu



====


ALTER SESSION SET NLS_TIMESTAMP_FORMAT='DD-MON-YY HH:MI:SSXFF';
alter session set nls_date_format = 'DD-MON-YYYY HH24:MI:SS';

var h varchar2(30)
 begin :h := 'ANUJ'; end;  ---- User Name !!!!
/    

SELECT 
  username,
  DBMS_STATS.get_prefs(ownname=>USER,pname=>'INCREMENTAL') incremental,
  DBMS_STATS.get_prefs(ownname=>USER,pname=>'GRANULARITY') granularity,
  DBMS_STATS.get_prefs(ownname=>USER,pname=>'STALE_PERCENT') stale_percent,
  DBMS_STATS.get_prefs(ownname=>USER,pname=>'ESTIMATE_PERCENT') estimate_percent,
  DBMS_STATS.get_prefs(ownname=>USER,pname=>'CASCADE') cascade,
  DBMS_STATS.get_prefs(pname=>'METHOD_OPT') method_opt
FROM dba_users
WHERE username = :h
ORDER BY username;



ALTER SESSION SET NLS_TIMESTAMP_FORMAT='DD-MON-YY HH:MI:SSXFF';
alter session set nls_date_format = 'DD-MON-YYYY HH24:MI:SS';

var h varchar2(30)
 begin :h := 'T101'; end;  ---- table name here!!!!
/    
SELECT 
  owner, table_name,
  DBMS_STATS.get_prefs(ownname=>USER,tabname=>table_name,pname=>'INCREMENTAL') incremental,
  DBMS_STATS.get_prefs(ownname=>USER,tabname=>table_name,pname=>'GRANULARITY') granularity,
  DBMS_STATS.get_prefs(ownname=>USER,tabname=>table_name,pname=>'STALE_PERCENT') stale_percent,
  DBMS_STATS.get_prefs(ownname=>USER,tabname=>table_name,pname=>'ESTIMATE_PERCENT') estimate_percent,
  DBMS_STATS.get_prefs(ownname=>USER,tabname=>table_name,pname=>'CASCADE') cascade,
  DBMS_STATS.get_prefs(pname=>'METHOD_OPT') method_opt
FROM dba_tables
WHERE table_name = :h
ORDER BY owner, table_name;




exec dbms_stats.set_table_prefs('SCOTT', EMP', 'STALE_PERCENT', '1');
EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMP');

exec dbms_stats.set_table_prefs('SCOTT', EMP', 'STALE_PERCENT', '10');

===



alter session set nls_date_format='dd-mm-yyyy hh24:mi' ;
set linesize 300
select * from (select owner, table_name,num_rows,last_analyzed from dba_tables where table_name='XXX'),
               (select count(*) from o.XXX);


=======


set head off feed off
set pages 10000  lines 500
col command for a200
select 'exec dbms_stats.gather_table_stats(ownname => '''||owner||''',tabname => '''||table_name ||''', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, cascade => TRUE,method_opt => '' FOR ALL COLUMNS SIZE AUTO'', degree => 8);' command
from dba_tables 
where owner='TEST';



 set pages 10000  lines 500
col command for a250
select 'exec dbms_stats.gather_index_stats(  ownname=> '''||owner||'''   ,indname=>''' || index_name ||'''  ,estimate_percent=> DBMS_STATS.AUTO_SAMPLE_SIZE , degree=> 6   ,no_invalidate=> DBMS_STATS.AUTO_INVALIDATE  ,granularity=> ''AUTO'');'  command
from dba_indexes 
where owner ='TEST';


 SELECT 'Exec DBMS_STATS.GATHER_TABLE_STATS (ownname=>'''||table_owner||''',tabname=>'''||table_name||''',partname=>'''||partition_name||''',
method_opt=>''FOR ALL COLUMS SIZE 1",estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE, CASCADE=>TRUE,DEGREE=>6);' 
from DBA_TAB_PARTITIONS where table_owner in ('SCHEMA');



=========


-- DBA_TAB_STATS_HISTORY provides a history of table statistics modifications for all tables in the database



define owner='TTTTT'
define table='XXXX'

col OWNER     format a20                                                                                                                       
col TABLE_NAME format a20
column partition_name format a20
column subpartition_name format a20
set linesize 500
set pages 9999
select owner,table_name,partition_name,subpartition_name,stats_update_time from dba_tab_stats_history where owner='&owner' and table_name='&table'
order by stats_update_time;





set long 2000000
set pagesize 1000

select * from table(dbms_stats.diff_table_stats_in_history(
                    ownname => '&owner',
                    tabname => '&table',
                    time1 => systimestamp,
                    time2 => to_timestamp('10-MAR-22 07.47.19 PM','DD-MON-YY hh12.mi.ss AM'),
                    pctthreshold => 0));  


======================



object_dependent_segments 



  object_type_table = 1
  object_type_nested_table = 2
  object_type_index = 3
  object_type_cluster = 4
  object_type_table_partition = 7
  object_type_index_partition = 8
  object_type_table_subpartition = 9
  object_type_index_subpartition = 10
  object_type_mv = 13
  object_type_mvlog = 14




set linesize 200
col segment_owner format a25
col segment_name format a25
col segment_type format a20
col tablespace_name format a20
col partition_name format a20
col lob_column_name format a12
set serveroutput on
  select
     segment_owner,
     segment_name,
     segment_type,
     tablespace_name
  from
     (table(dbms_space.object_dependent_segments(
               objowner => 'SCOTT',
             objname     => 'EMP',
             partname    => NULL,
             objtype     => 1)));
 
 
 
SEGMENT_OWNER             SEGMENT_NAME              SEGMENT_TYPE         TABLESPACE_NAME
------------------------- ------------------------- -------------------- --------------------
SCOTT                     EMP                       TABLE                USERS
SCOTT                     PK_EMP                    INDEX                USERS
SCOTT                     IX_DEPTNO                 INDEX                USERS





*****************************



define IF_COMMENT=' '
--define IF_COMMENT='--' 

define schema='SCOTT'
define table_name ='EMP'

SET ECHO        OFF 
SET FEEDBACK    10  HEADING     ON  LINESIZE    180  LONG   9000  PAGESIZE 300 TERMOUT ON  TIMING  OFF  TRIMOUT  ON  TRIMSPOOL   ON VERIFY      OFF

CLEAR COLUMNS
CLEAR BREAKS
CLEAR COMPUTES

PROMPT 
PROMPT +------------------------------------------------------------------------+
PROMPT | TABLE INFORMATION                                                      |
PROMPT +------------------------------------------------------------------------+

COLUMN owner               FORMAT a20                   HEADING "Owner"
COLUMN table_name          FORMAT a30                   HEADING "Table Name"
COLUMN tablespace_name     FORMAT a30                   HEADING "Tablespace"
COLUMN last_analyzed       FORMAT a23                   HEADING "Last Analyzed"
COLUMN num_rows            FORMAT 9,999,999,999,999     HEADING "# of Rows"

SELECT
    owner
  , table_name
  , tablespace_name
  , TO_CHAR(last_analyzed, 'DD-MON-YYYY HH24:MI:SS') last_analyzed
  , num_rows
FROM
    dba_tables
WHERE 1=1
   &IF_COMMENT and    owner      = UPPER('&schema')
 AND table_name = UPPER('&table_name')
/

PROMPT 
PROMPT +------------------------------------------------------------------------+
PROMPT | OBJECT INFORMATION                                                     |
PROMPT +------------------------------------------------------------------------+

COLUMN object_id                                     HEADING "Object ID"
COLUMN data_object_id                                HEADING "Data Object ID"
COLUMN created             FORMAT A23                HEADING "Created"
COLUMN last_ddl_time       FORMAT A23                HEADING "Last DDL"
COLUMN status                                        HEADING "Status"

SELECT
    object_id
  , data_object_id
  , TO_CHAR(created, 'DD-MON-YYYY HH24:MI:SS')        created
  , TO_CHAR(last_ddl_time, 'DD-MON-YYYY HH24:MI:SS')  last_ddl_time
  , status
FROM
    dba_objects
WHERE  1=1
    &IF_COMMENT and     owner       = UPPER('&schema')
  AND object_name = UPPER('&table_name')
  AND object_type = 'TABLE'
/

PROMPT 
PROMPT +------------------------------------------------------------------------+
PROMPT | SEGMENT INFORMATION                                                    |
PROMPT +------------------------------------------------------------------------+

COLUMN segment_name        FORMAT a30                HEADING "Segment Name"
COLUMN partition_name      FORMAT a30                HEADING "Partition Name"
COLUMN segment_type        FORMAT a16                HEADING "Segment Type"
COLUMN tablespace_name     FORMAT a30                HEADING "Tablespace"
COLUMN num_rows            FORMAT 9,999,999,999,999  HEADING "Num Rows"
COLUMN bytes               FORMAT 9,999,999,999,999  HEADING "Bytes"
COLUMN last_analyzed       FORMAT a23                HEADING "Last Analyzed"

SELECT 
    seg.segment_name      segment_name
  , null                  partition_name
  , seg.segment_type      segment_type
  , seg.tablespace_name   tablespace_name
  , tab.num_rows          num_rows
  , seg.bytes             bytes
  , TO_CHAR(tab.last_analyzed, 'DD-MON-YYYY HH24:MI:SS') last_analyzed
from
    dba_segments seg
  , dba_tables tab
WHERE  1=1
   &IF_COMMENT and      seg.owner = UPPER('&schema')
  AND seg.segment_name = UPPER('&table_name')
  AND seg.segment_name = tab.table_name
  AND seg.owner = tab.owner
  AND seg.segment_type = 'TABLE'
UNION ALL
SELECT 
    seg.segment_name      segment_name
  , seg.partition_name    partition_name
  , seg.segment_type      segment_type
  , seg.tablespace_name   tablespace_name
  , part.num_rows         num_rows
  , seg.bytes             bytes
  , TO_CHAR(part.last_analyzed, 'DD-MON-YYYY HH24:MI:SS') last_analyzed
FROM
    dba_segments seg
  , dba_tab_partitions part
WHERE  1=1
    &IF_COMMENT and     part.table_owner = UPPER('&schema')
  AND part.table_name = UPPER('&table_name')
  AND part.partition_name = seg.partition_name
  AND seg.segment_type = 'TABLE PARTITION'
ORDER BY
    segment_name
  , partition_name
/


PROMPT 
PROMPT +------------------------------------------------------------------------+
PROMPT | COLUMNS                                                                |
PROMPT +------------------------------------------------------------------------+

COLUMN column_name         FORMAT a30                HEADING "Column Name"
COLUMN data_type           FORMAT a25                HEADING "Data Type"
COLUMN nullable            FORMAT a13                HEADing "Null?"

SELECT
    column_name
  , DECODE(nullable, 'Y', ' ', 'NOT NULL') nullable
  , DECODE(data_type
               , 'RAW',      data_type || '(' ||  data_length || ')'
               , 'CHAR',     data_type || '(' ||  data_length || ')'
               , 'VARCHAR',  data_type || '(' ||  data_length || ')'
               , 'VARCHAR2', data_type || '(' ||  data_length || ')'
               , 'NUMBER', NVL2(   data_precision
                                 , DECODE(    data_scale
                                            , 0
                                            , data_type || '(' || data_precision || ')'
                                            , data_type || '(' || data_precision || ',' || data_scale || ')'
                                   )
                                 , data_type)
               , data_type
    ) data_type
FROM
    dba_tab_columns
WHERE  1=1
     &IF_COMMENT and    owner      = UPPER('&schema')
  AND table_name = UPPER('&table_name')
ORDER BY
    column_id
/


PROMPT 
PROMPT +------------------------------------------------------------------------+
PROMPT | INDEXES                                                                |
PROMPT +------------------------------------------------------------------------+

COLUMN index_name          FORMAT a40                HEADING "Index Name"
COLUMN column_name         FORMAT a30                HEADING "Column Name"
COLUMN column_length                                 HEADING "Column Length"

BREAK ON index_name SKIP 1

SELECT 
    index_owner || '.' || index_name  index_name
  , column_name
  , column_length
FROM
    dba_ind_columns
WHERE  1=1
    &IF_COMMENT and     table_owner  = UPPER('&schema')
  AND table_name   = UPPER('&table_name')
ORDER BY
    index_name
  , column_position
/


PROMPT 
PROMPT +------------------------------------------------------------------------+
PROMPT | CONSTRAINTS                                                            |
PROMPT +------------------------------------------------------------------------+

COLUMN constraint_name     FORMAT a30                HEADING "Constraint Name"
COLUMN constraint_type     FORMAT a13                HEADING "Constraint|Type"
COLUMN search_condition    FORMAT a30                HEADING "Search Condition"
COLUMN r_constraint_name   FORMAT a30                HEADING "R / Constraint Name"
COLUMN delete_rule         FORMAT a12                HEADING "Delete Rule"
COLUMN status                                        HEADING "Status"

BREAK ON constraint_name ON constraint_type

SELECT 
    a.constraint_name
  , DECODE(a.constraint_type
             , 'P', 'Primary Key'
             , 'C', 'Check'
             , 'R', 'Referential'
             , 'V', 'View Check'
             , 'U', 'Unique'
             , a.constraint_type
    ) constraint_type
  , b.column_name
  , a.search_condition
  , NVL2(a.r_owner, a.r_owner || '.' ||  a.r_constraint_name, null) r_constraint_name
  , a.delete_rule
  , a.status
FROM 
    dba_constraints  a
  , dba_cons_columns b
WHERE  1=1
    &IF_COMMENT and     a.owner            = UPPER('&schema')
  AND a.table_name       = UPPER('&table_name')
  AND a.constraint_name  = b.constraint_name
  AND b.owner            = UPPER('&schema')
  AND b.table_name       = UPPER('&table_name')
ORDER BY
    a.constraint_name
  , b.position
/


PROMPT 
PROMPT +------------------------------------------------------------------------+
PROMPT | PARTITIONS (TABLE)                                                     |
PROMPT +------------------------------------------------------------------------+

COLUMN partition_name                                HEADING "Partition Name"
COLUMN column_name         FORMAT a30                HEADING "Column Name"
COLUMN tablespace_name     FORMAT a30                HEADING "Tablespace"
COLUMN composite           FORMAT a9                 HEADING "Composite"
COLUMN subpartition_count                            HEADING "Sub. Part.|Count"
COLUMN logging             FORMAT a7                 HEADING "Logging"
COLUMN high_value          FORMAT a13                HEADING "High Value" TRUNC

BREAK ON partition_name

SELECT
    a.partition_name
  , b.column_name
  , a.tablespace_name
  , a.composite
  , a.subpartition_count
  , a.logging
FROM 
    dba_tab_partitions    a
  , dba_part_key_columns  b
WHERE  1=1
   &IF_COMMENT and      a.table_owner        = UPPER('&schema')
  AND a.table_name         = UPPER('&table_name')
  AND RTRIM(b.object_type) = 'TABLE'
  AND b.owner              = a.table_owner
  AND b.name               = a.table_name
ORDER BY
    a.partition_position
  , b.column_position
/


PROMPT 
PROMPT +------------------------------------------------------------------------+
PROMPT | PARTITIONS (INDEX)                                                     |
PROMPT +------------------------------------------------------------------------+

COLUMN index_name              FORMAT a30                HEADING "Index Name"
COLUMN partitioning_type       FORMAT a9                 HEADING "Type"
COLUMN partition_count         FORMAT 99999              HEADING "Part.|Count"
COLUMN partitioning_key_count  FORMAT 99999              HEADING "Part.|Key Count"
COLUMN locality                FORMAT a8                 HEADING "Locality"
COLUMN alignment               FORMAT a12                HEADING "Alignment"

SELECT
    a.owner || '.' || a.index_name   index_name
  , b.column_name
  , a.partitioning_type
  , a.partition_count
  , a.partitioning_key_count
  , a.locality
  , a.alignment
FROM 
    dba_part_indexes      a
  , dba_part_key_columns  b
WHERE  1=1
   &IF_COMMENT and      a.owner              = UPPER('&schema')
  AND a.table_name         = UPPER('&table_name')
  AND RTRIM(b.object_type) = 'INDEX'
  AND b.owner              = a.owner
  AND b.name               = a.index_name
ORDER BY
    a.index_name
  , b.column_position
/



PROMPT 
PROMPT +------------------------------------------------------------------------+
PROMPT | TRIGGERS                                                               |
PROMPT +------------------------------------------------------------------------+

COLUMN trigger_name            FORMAT a30                HEADING "Trigger Name"
COLUMN trigger_type            FORMAT a18                HEADING "Type"
COLUMN triggering_event        FORMAT a9                 HEADING "Trig.|Event"
COLUMN referencing_names       FORMAT a65                HEADING "Referencing Names" newline
COLUMN when_clause             FORMAT a65                HEADING "When Clause" newline
COLUMN trigger_body            FORMAT a65                HEADING "Trigger Body" newline

SELECT
    owner || '.' || trigger_name  trigger_name
  , trigger_type
  , triggering_event
  , status
  , referencing_names
  , when_clause
  , trigger_body
FROM
    dba_triggers
WHERE  1=1
    &IF_COMMENT and  table_owner = UPPER('&schema')
  AND table_name  = UPPER('&table_name')
ORDER BY
     trigger_name
/

====


Script to Show Objects That are Missing Statistics ( Doc ID 957993.1 )

SET LINESIZE 300 PAGESIZE 300 time on timing on 
COL OWNER FOR A20
COL OBJECT_NAME FOR A40
col stale_stats for a14
col stattype_locked for a18

select /*+ PARALLEL(8) */  * from (
SELECT 0 "con_id" ,'TABLE' object_type,owner, table_name object_name, last_analyzed, stattype_locked, stale_stats FROM all_tab_statistics
WHERE (last_analyzed IS NULL OR stale_stats = 'YES') and stattype_locked IS NULL
and owner NOT IN ('ANONYMOUS', 'CTXSYS', 'DBSNMP', 'EXFSYS','LBACSYS','MDSYS','MGMT_VIEW','OLAPSYS','OWBSYS','ORDPLUGINS','ORDSYS','OUTLN','SI_INFORMTN_SCHEMA','SYS', 'SYSMAN','SYSTEM','TSMSYS','WK_TEST','WKSYS','WKPROXY','WMSYS','XDB' )
AND owner NOT LIKE 'FLOW%'
and owner NOT LIKE 'APEX%'
union all
SELECT con_id,'TABLE' object_type,owner, table_name object_name, last_analyzed, stattype_locked, stale_stats FROM cdb_tab_statistics
WHERE (last_analyzed IS NULL OR stale_stats = 'YES') and stattype_locked IS NULL
and owner NOT IN ('ANONYMOUS', 'CTXSYS', 'DBSNMP', 'EXFSYS','LBACSYS','MDSYS','MGMT_VIEW','OLAPSYS','OWBSYS','ORDPLUGINS','ORDSYS','OUTLN','SI_INFORMTN_SCHEMA','SYS', 'SYSMAN','SYSTEM','TSMSYS','WK_TEST','WKSYS','WKPROXY','WMSYS','XDB' )
AND owner NOT LIKE 'FLOW%'
and owner NOT LIKE 'APEX%'
UNION ALL
SELECT 0,'INDEX' object_type,owner, index_name object_name,  last_analyzed, stattype_locked, stale_stats FROM all_ind_statistics
WHERE (last_analyzed IS NULL OR stale_stats = 'YES') and stattype_locked IS NULL
AND owner NOT IN ('ANONYMOUS', 'CTXSYS', 'DBSNMP', 'EXFSYS','LBACSYS','MDSYS','MGMT_VIEW','OLAPSYS','OWBSYS','ORDPLUGINS','ORDSYS','OUTLN','SI_INFORMTN_SCHEMA','SYS', 'SYSMAN','SYSTEM','TSMSYS','WK_TEST','WKSYS','WKPROXY','WMSYS','XDB' )
AND owner NOT LIKE 'FLOW%'
and owner NOT LIKE 'APEX%'
UNION ALL
SELECT con_id ,'INDEX' object_type,owner, index_name object_name,  last_analyzed, stattype_locked, stale_stats FROM cdb_ind_statistics
WHERE (last_analyzed IS NULL OR stale_stats = 'YES') and stattype_locked IS NULL
AND owner NOT IN ('ANONYMOUS', 'CTXSYS', 'DBSNMP', 'EXFSYS','LBACSYS','MDSYS','MGMT_VIEW','OLAPSYS','OWBSYS','ORDPLUGINS','ORDSYS','OUTLN','SI_INFORMTN_SCHEMA','SYS', 'SYSMAN','SYSTEM','TSMSYS','WK_TEST','WKSYS','WKPROXY','WMSYS','XDB' )
AND owner NOT LIKE 'FLOW%'
and owner NOT LIKE 'APEX%'
ORDER BY object_type desc, owner, object_name
)



col last_analyzed for a13


prompt 'Statistics for SYS tables'
SELECT NVL(TO_CHAR(last_analyzed, 'YYYY-Mon-DD'), 'NO STATS') last_analyzed, COUNT(*) dictionary_tables
FROM dba_tables
WHERE owner = 'SYS'
GROUP BY TO_CHAR(last_analyzed, 'YYYY-Mon-DD')
ORDER BY 1 DESC;

prompt 'Statistics for Fixed Objects'
select NVL(TO_CHAR(last_analyzed, 'YYYY-Mon-DD'), 'NO STATS') last_analyzed, COUNT(*) fixed_objects
FROM dba_tab_statistics
WHERE object_type = 'FIXED TABLE'
GROUP BY TO_CHAR(last_analyzed, 'YYYY-Mon-DD')
ORDER BY 1 DESC;




==




set linesize 500 pagesize 300
define tables_list='EMP'

--SET LONG 200 LONGC 20

COL index_and_column_name FOR A70
COL table_and_column_name FOR A70
COL data_type FOR A20
COL data_default FOR A20
COL low_value FOR A32
COL high_value FOR A32
COL low_value_translated FOR A32
COL high_value_translated FOR A32
col TABLE_AND_COLUMN_NAME for a25
PRO
PRO Table Columns 
PRO ~~~~~~~~~~~~~

SELECT c.owner||'.'||c.table_name||' '||c.column_name table_and_column_name,
       c.data_type,
       c.nullable,
       c.data_default,
       c.num_distinct,
       CASE WHEN c.data_type = 'NUMBER' THEN to_char(utl_raw.cast_to_number(c.low_value))
        WHEN c.data_type IN ('VARCHAR2', 'CHAR') THEN SUBSTR(to_char(utl_raw.cast_to_varchar2(c.low_value)),1,32)
        WHEN c.data_type IN ('NVARCHAR2','NCHAR') THEN SUBSTR(to_char(utl_raw.cast_to_nvarchar2(c.low_value)),1,32)
        WHEN c.data_type = 'BINARY_DOUBLE' THEN to_char(utl_raw.cast_to_binary_double(c.low_value))
        WHEN c.data_type = 'BINARY_FLOAT' THEN to_char(utl_raw.cast_to_binary_float(c.low_value))
        WHEN c.data_type = 'DATE' THEN rtrim(
                    ltrim(to_char(100*(to_number(substr(c.low_value,1,2) ,'XX')-100) + (to_number(substr(c.low_value,3,2) ,'XX')-100),'0000'))||'-'||
                    ltrim(to_char(     to_number(substr(c.low_value,5,2) ,'XX')  ,'00'))||'-'||
                    ltrim(to_char(     to_number(substr(c.low_value,7,2) ,'XX')  ,'00'))||'/'||
                    ltrim(to_char(     to_number(substr(c.low_value,9,2) ,'XX')-1,'00'))||':'||
                    ltrim(to_char(     to_number(substr(c.low_value,11,2),'XX')-1,'00'))||':'||
                    ltrim(to_char(     to_number(substr(c.low_value,13,2),'XX')-1,'00')))
        WHEN c.data_type LIKE 'TIMESTAMP%' THEN rtrim(
                    ltrim(to_char(100*(to_number(substr(c.low_value,1,2) ,'XX')-100) + (to_number(substr(c.low_value,3,2) ,'XX')-100),'0000'))||'-'||
                    ltrim(to_char(     to_number(substr(c.low_value,5,2) ,'XX')  ,'00'))||'-'||
                    ltrim(to_char(     to_number(substr(c.low_value,7,2) ,'XX')  ,'00'))||'/'||
                    ltrim(to_char(     to_number(substr(c.low_value,9,2) ,'XX')-1,'00'))||':'||
                    ltrim(to_char(     to_number(substr(c.low_value,11,2),'XX')-1,'00'))||':'||
                    ltrim(to_char(     to_number(substr(c.low_value,13,2),'XX')-1,'00'))||'.'||
                    to_number(substr(c.low_value,15,8),'XXXXXXXX'))
       END low_value_translated,
       CASE WHEN c.data_type = 'NUMBER' THEN to_char(utl_raw.cast_to_number(c.high_value))
        WHEN c.data_type IN ('VARCHAR2', 'CHAR') THEN SUBSTR(to_char(utl_raw.cast_to_varchar2(c.high_value)),1,32)
        WHEN c.data_type IN ('NVARCHAR2','NCHAR') THEN SUBSTR(to_char(utl_raw.cast_to_nvarchar2(c.high_value)),1,32)
        WHEN c.data_type = 'BINARY_DOUBLE' THEN to_char(utl_raw.cast_to_binary_double(c.high_value))
        WHEN c.data_type = 'BINARY_FLOAT' THEN to_char(utl_raw.cast_to_binary_float(c.high_value))
        WHEN c.data_type = 'DATE' THEN rtrim(
                    ltrim(to_char(100*(to_number(substr(c.high_value,1,2) ,'XX')-100) + (to_number(substr(c.high_value,3,2) ,'XX')-100),'0000'))||'-'||
                    ltrim(to_char(     to_number(substr(c.high_value,5,2) ,'XX')  ,'00'))||'-'||
                    ltrim(to_char(     to_number(substr(c.high_value,7,2) ,'XX')  ,'00'))||'/'||
                    ltrim(to_char(     to_number(substr(c.high_value,9,2) ,'XX')-1,'00'))||':'||
                    ltrim(to_char(     to_number(substr(c.high_value,11,2),'XX')-1,'00'))||':'||
                    ltrim(to_char(     to_number(substr(c.high_value,13,2),'XX')-1,'00')))
        WHEN c.data_type LIKE 'TIMESTAMP%' THEN rtrim(
                    ltrim(to_char(100*(to_number(substr(c.high_value,1,2) ,'XX')-100) + (to_number(substr(c.high_value,3,2) ,'XX')-100),'0000'))||'-'||
                    ltrim(to_char(     to_number(substr(c.high_value,5,2) ,'XX')  ,'00'))||'-'||
                    ltrim(to_char(     to_number(substr(c.high_value,7,2) ,'XX')  ,'00'))||'/'||
                    ltrim(to_char(     to_number(substr(c.high_value,9,2) ,'XX')-1,'00'))||':'||
                    ltrim(to_char(     to_number(substr(c.high_value,11,2),'XX')-1,'00'))||':'||
                    ltrim(to_char(     to_number(substr(c.high_value,13,2),'XX')-1,'00'))||'.'||
                    to_number(substr(c.high_value,15,8),'XXXXXXXX'))
        END high_value_translated,
       c.density,
       c.num_nulls,
       c.num_buckets,
       c.histogram,
       c.sample_size,
       TO_CHAR(c.last_analyzed, 'YYYY-MM-DD"T"HH24:MI:SS') last_analyzed,
       c.global_stats,
       c.avg_col_len
  FROM dba_tab_cols c
 WHERE 1=1 
-- (c.owner, c.table_name) IN ('&&tables_list')
and c.table_name IN ('&&tables_list')
 ORDER BY
       c.owner,
       c.table_name,
       c.column_name
/




TABLE_AND_COLUMN_NAME     DATA_TYPE            N DATA_DEFAULT         NUM_DISTINCT LOW_VALUE_TRANSLATED             HIGH_VALUE_TRANSLATED               DENSITY  NUM_NULLS NUM_BUCKETS HISTOGRAM       SAMPLE_SIZE LAST_ANALYZED       GLO AVG_COL_LEN
------------------------- -------------------- - -------------------- ------------ -------------------------------- -------------------------------- ---------- ---------- ----------- --------------- ----------- ------------------- --- -----------
ANUJ.EMP COMM             NUMBER               Y                                 4 0                                1400                                    .25    2621440           1 NONE                1048576 2022-12-19T04:01:36 YES           2
ANUJ.EMP DEPTNO           NUMBER               Y                                 3 10                               30                               .333333333          0           1 NONE                3670016 2022-12-19T04:01:36 YES           3
ANUJ.EMP EMPNO            NUMBER               Y                                14 7369                             7934                             1.3624E-07          0          14 FREQUENCY           3670016 2022-12-19T04:01:36 YES           4
ANUJ.EMP ENAME            VARCHAR2             Y                                14 ADAMS                            WARD                             .071428571          0           1 NONE                3670016 2022-12-19T04:01:36 YES           6
ANUJ.EMP HIREDATE         DATE                 Y                                13 1980-12-17/00:00:00              1987-05-23/00:00:00              .076923077          0           1 NONE                3670016 2022-12-19T04:01:36 YES           8
ANUJ.EMP JOB              VARCHAR2             Y                                 5 ANALYST                          SALESMAN                                 .2          0           1 NONE                3670016 2022-12-19T04:01:36 YES           8
ANUJ.EMP MGR              NUMBER               Y                                 6 7566                             7902                             .166666667     262144           1 NONE                3407872 2022-12-19T04:01:36 YES           4
ANUJ.EMP SAL              NUMBER               Y                                12 800                              5000                             .083333333          0           1 NONE                3670016 2022-12-19T04:01:36 YES           4
ANUJ1.EMP COMM            NUMBER               Y                                 4 0                                1400                                    .25         10           1 NONE                     4 2018-03-04T13:30:54 YES            2
ANUJ1.EMP DEPTNO          NUMBER               Y                                 3 10                               30                               .035714286          0           3 FREQUENCY               14 2018-03-04T13:30:54 YES            3
ANUJ1.EMP EMPNO           NUMBER               N                                14 7369                             7934                             .071428571          0           1 NONE                    14 2018-03-04T13:30:54 YE



=====





-- identify statistics



set linesize 300 pagesize 300
define table_name='SCHEDULER$_EVENT_LOG'  ------<<<<

col TABLE_NAME     for a20                 
col INDEX_NAME for a27  
select   table_name ,last_analyzed,stattype_locked,stale_stats, num_rows, blocks,LAST_ANALYZED from dba_tab_statistics 
where    1=1
and table_name = '&table_name'
--and stale_stats ='YES'
;

select   table_name,index_name, blevel, leaf_blocks, distinct_keys,clustering_factor, num_rows ,LAST_ANALYZED from  dba_ind_statistics
where    1=1
-- and index_name = 'XXXX'
and table_name = '&table_name'
;


col COLUMN_NAME for a20
col LOW_VALUE for a30
col HIGH_VALUE for a30
select    table_name, column_name, num_distinct, density,low_value, high_value, histogram from  dba_tab_col_statistics
where    1=1
-- and  table_name = 'XXXX'
and table_name = '&table_name'
;


col ENDPOINT_VALUE for 99999999999999999999999999999999999999999999999999999999999
select   table_name ,  column_name, endpoint_number, endpoint_value from  dba_tab_histograms
where    1=1
-- and  table_name = 'XXXX'
and table_name = '&table_name'
;


col INDEX_OWNER for a20 
col INDEX_NAME for a27 
col PARTITION_NAME for a20
select ds.index_owner, ds.index_name, ds.partition_name, ds.status from dba_ind_partitions ds 
where ds.index_name='xxx'  

col owner for a20 
col index_name for a27
col partition_name for a27
col dba_ind_partitions_status for a15
col dba_indexes_status for a20
select d1.owner,
       d1.index_name,
       d1.partitioned,
       d2.partition_name,
       d1.status     dba_indexes_status,
       d2.status     dba_ind_partitions_status
  from dba_indexes d1, dba_ind_partitions d2
 where     d1.index_name = d2.index_name
       and d1.table_name = '&table_name'

OWNER                INDEX_NAME                  PAR PARTITION_NAME              DBA_INDEXES_STATUS   DBA_IND_PARTITI
-------------------- --------------------------- --- --------------------------- -------------------- ---------------
AUDSYS               SYS_IL0000017948C00097$$    YES SYS_IL_P25515               N/A                  USABLE
AUDSYS               SYS_IL0000017948C00097$$    YES SYS_IL_P25935               N/A                  USABLE
A

column extension format a40
select extension_name, extension from   dba_stat_extensions
where  table_name = '&table_name';



SELECT DS.INDEX_OWNER,
         DS.INDEX_NAME,
         DS.PARTITION_NAME,
         DS.PARTITION_POSITION,
            'ALTER INDEX '
         || INDEX_OWNER
         || '.'
         || INDEX_NAME
         || ' REBUILD PARTITION '
         || PARTITION_NAME
         || ' TABLESPACE '
         || TABLESPACE_NAME
         || ' ONLINE;'
             ONLINE_REBUILD_COMMAND
    FROM DBA_IND_PARTITIONS DS
   WHERE STATUS = 'UNUSABLE' 
   AND DS.INDEX_NAME = '&Index_NAME'
ORDER BY DS.PARTITION_POSITION DESC 
/




The following identifies  potential for Extended Statistics

exec DBMS_STATS.SEED_COL_USAGE(null,null,600);


SET LONG 10000  LONGCHUNKSIZE 7000  LINESIZE 100


Select dbms_stats.report_col_usage('SCOTT','EMP') from dual ;



COLUMN USAGE REPORT FOR SCOTT.EMP
.................................

1. EMPNO                               : EQ
2. ENAME                               : EQ
###############################################################################




EQ         : Used in single table EQuality predicate
RANGE      : Used in single table RANGE predicate
LIKE       : Used in single table LIKE predicate
NULL       : Used in single table is (not) NULL predicate
EQ_JOIN    : Used in EQuality JOIN predicate
NONEQ_JOIN : Used in NON EQuality JOIN predicate
FILTER     : Used in single table FILTER predicate
JOIN       : Used in JOIN predicate
GROUP_BY   : Used in GROUP BY expression


======


size

define owner='SCOTT'
define tbl_name='EMP'

set linesize 200
col TABLE_NAME for a20
SELECT
SUBSTR(TABLE_NAME, 1, 21) TABLE_NAME,
ROUND(BLOCKS * (8000 - 23 * INI_TRANS) * (1 - PCT_FREE / 100) / 1000000, 0) GROSS_MB,
ROUND((AVG_ROW_LEN + 1) * NUM_ROWS / 1000000, 0) USED_MB,
ROUND((BLOCKS * (8000 - 23 * INI_TRANS) * (1 - PCT_FREE / 100) - (AVG_ROW_LEN + 1) * NUM_ROWS) / 1000000) "WASTED_MB"
FROM DBA_TABLES
WHERE 1=1
and NUM_ROWS IS NOT NULL 
AND OWNER = upper('&owner') 
AND table_name = upper('&tbl_name')
ORDER BY 4 DESC
/





set linesize 500 
col INDEX_OWNER for a20
col INDEX_NAME for a20
col PARTITION_NAME for a20


define OWNERNAME='SCOTT'
define TABLENAME='EMP'



SELECT index_owner, index_name, partition_name, leaf_blocks, pct_free, col_len, num_rows, ini_trans,
  TRUNC (leaf_blocks - ( (num_rows * (col_len + 10)) / ( (block_size - 66 - ini_trans * 24) * (1 - pct_free / 100)))) extra_blocks, 
  ROUND (100 * (1 - (leaf_blocks - ( (num_rows * (col_len + 10)) / ( (block_size - 66 - ini_trans * 24) * (1 - pct_free / 100)))) / leaf_blocks), 2) density,
  ROUND (leaf_blocks * 8 / 1024 / 1024, 2) GB,
  ROUND (TRUNC (leaf_blocks - ( (num_rows * (col_len + 10)) / ( (block_size - 66 - ini_trans * 24) * (1 - pct_free / 100)))) * 8 / 1024 / 1024, 2) extra_GB, 
  ROUND (TRUNC (leaf_blocks - ( (num_rows * (col_len + 10)) / ( (block_size - 66 - ini_trans * 24) * (1 - 0 / 100)))) * 8 / 1024 / 1024, 2) extra_GB_0_PCTFREE
FROM
  (
    SELECT ip.index_owner, ip.index_name, ip.partition_name, ip.leaf_blocks, ip.num_rows, ip.pct_free, ip.ini_trans,
      cl.col_len, ts.block_size
    FROM dba_ind_partitions ip, dba_indexes i, dba_tablespaces ts, (
        SELECT ic.index_owner, ic.index_name, tc.partition_name, SUM (tc.avg_col_len) col_len
        FROM dba_ind_columns ic, DBA_PART_COL_STATISTICS tc
        WHERE ic.table_owner = '&OWNERNAME'
        AND ic.table_name = '&TABLENAME'
        AND tc.owner = ic.table_owner
        AND tc.table_name = ic.table_name
        AND tc.column_name = ic.column_name
        GROUP BY ic.index_owner, ic.index_name, partition_name
      )
      cl
    WHERE ip.index_owner = i.owner
    AND ip.index_name = i.index_name
    AND i.table_owner = '&OWNERNAME'
    AND i.table_name = '&TABLENAME'
    AND cl.index_owner = i.owner
    AND cl.index_name = i.index_name
    AND cl.partition_name = ip.partition_name
    AND ip.tablespace_name = ts.tablespace_name
    AND ip.leaf_blocks > 0
    UNION ALL
    SELECT i.owner index_owner, i.index_name, NULL partition_name, i.leaf_blocks, i.num_rows, i.pct_free, i.ini_trans,
      cl.col_len, ts.block_size
    FROM dba_indexes i, dba_tablespaces ts, (
        SELECT ic.index_owner, ic.index_name, SUM (tc.avg_col_len) col_len
        FROM dba_ind_columns ic, DBA_TAB_COL_STATISTICS tc
        WHERE ic.table_owner = '&OWNERNAME'
        AND ic.table_name = '&TABLENAME'
        AND tc.owner = ic.table_owner
        AND tc.table_name = ic.table_name
        AND tc.column_name = ic.column_name
        GROUP BY ic.index_owner, ic.index_name
      )
      cl
    WHERE i.table_owner = '&OWNERNAME'
    AND i.table_name = '&TABLENAME'
    AND i.partitioned = 'NO'
    AND cl.index_owner = i.owner
    AND cl.index_name = i.index_name
    AND i.tablespace_name = ts.tablespace_name
    AND i.leaf_blocks > 0    
  )
ORDER BY index_owner, index_name, partition_name ;


INDEX_OWNER          INDEX_NAME           PARTITION_NAME       LEAF_BLOCKS   PCT_FREE    COL_LEN   NUM_ROWS  INI_TRANS EXTRA_BLOCKS    DENSITY         GB   EXTRA_GB EXTRA_GB_0_PCTFREE
-------------------- -------------------- -------------------- ----------- ---------- ---------- ---------- ---------- ------------ ---------- ---------- ---------- ------------------
SCOTT                PK_EMP                                              1         10          4         14          2            0        2.7          0          0                  0


====





set linesize 300 pagesize 300
col EXTENSION for a30
WITH i as ( /*composite indexes*/
SELECT i.table_owner, i.table_name, i.owner index_owner, i.index_name, i.distinct_keys
,        '('||(LISTAGG('"'||c.column_name||'"',',') WITHIN GROUP (order by c.column_position))||')' column_list
FROM    dba_indexes i
,       dba_ind_columns c
WHERE   i.table_owner = c.table_owner
AND     i.table_name = c.table_name
AND     i.owner = c.index_owner
AND     i.index_name = c.index_name
AND     i.table_name NOT LIKE 'BIN$%'
AND     i.table_owner NOT IN ('SPLUNK','FLOWS_030000','ANONYMOUS','APEX_030200','APEX_040000','APEX_040200','APEX_SSO','APPQOSSYS','CTXSYS','DBSNMP','DIP','EXFSYS','FLOWS_FILES','MDSYS','OLAPSYS','ORACLE_OCM','ORDDATA','ORDPLUGINS','ORDSYS','OUTLN','OWBSYS')
AND     i.table_owner NOT IN ('SI_INFORMTN_SCHEMA','SQLTXADMIN','SQLTXPLAIN','SYS','SYSMAN','SYSTEM','TRCANLZR','WMSYS','XDB','XS$NULL','PERFSTAT','STDBYPERF','MGDSYS','OJVMSYS')
GROUP BY i.table_owner, i.table_name, i.owner, i.index_name, i.distinct_keys
HAVING COUNT(*) > 1 /*index with more than one column*/
), e as ( /*extended stats*/
SELECT  e.owner, e.table_name, e.extension_name
,       CAST(e.extension AS VARCHAR(1000)) extension
,       se.histogram, se.num_buckets, se.num_distinct
FROM    dba_stat_extensions e
,       dba_tab_col_statistics se
WHERE   e.creator = 'USER'
AND     se.owner = e.owner
AND     se.table_name = e.table_name
AND     se.column_name = e.extension_name
AND     e.table_name NOT LIKE 'BIN$%'
AND     e.owner NOT IN ('SPLUNK','FLOWS_030000','ANONYMOUS','APEX_030200','APEX_040000','APEX_040200','APEX_SSO','APPQOSSYS','CTXSYS','DBSNMP','DIP','EXFSYS','FLOWS_FILES','MDSYS','OLAPSYS','ORACLE_OCM','ORDDATA','ORDPLUGINS','ORDSYS','OUTLN','OWBSYS')
AND     e.owner NOT IN ('SI_INFORMTN_SCHEMA','SQLTXADMIN','SQLTXPLAIN','SYS','SYSMAN','SYSTEM','TRCANLZR','WMSYS','XDB','XS$NULL','PERFSTAT','STDBYPERF','MGDSYS','OJVMSYS')
)
SELECT  e.owner, e.table_name
,       'Extension' object_type
,       e.extension_name object_name, e.num_distinct, e.num_buckets, e.extension
,       sc.column_name
,       sc.num_distinct col_num_distinct
,       sc.num_buckets col_num_buckets
,       sc.histogram col_histogram
FROM    e
,       dba_tab_col_statistics sc
WHERE   e.histogram = 'NONE'
AND     e.extension LIKE '%"'||sc.column_name||'"%'
AND     sc.owner = e.owner
AND     sc.table_name = e.table_name
AND     sc.histogram != 'NONE'
AND     sc.num_buckets > 1 /*histogram on column*/
AND     e.num_buckets = 1 /*no histogram on extended stats*/
UNION ALL
SELECT  /*+  NO_MERGE  */ /* 3c.25 */
        i.table_owner, i.table_name
,       'Index' object_type
,       i.index_name object_name, i.distinct_keys, TO_NUMBER(null), i.column_list
,       sc.column_name
,       sc.num_distinct col_num_distinct
,       sc.num_buckets col_num_buckets
,       sc.histogram col_histogram
From    i
,       dba_ind_columns ic
,       dba_tab_col_statistics sc
WHERE   ic.table_owner = i.table_owner
AND     ic.table_name = i.table_name
AND     ic.index_owner = i.index_owner
AND     ic.index_name = i.index_name
AND     sc.owner = i.table_owner
AND     sc.table_name = ic.table_name
AND     sc.column_name = ic.column_name
AND     sc.histogram != 'NONE' 
AND     sc.num_buckets > 1 /*histogram on column*/
AND NOT EXISTS( /*report index if no extension*/
        SELECT 'x'
        FROM    e
        WHERE   e.owner = i.table_owner
        AND     e.table_name = i.table_name
        AND     e.extension = i.column_list)
ORDER BY 1,2,3,4;



----

set pagesize 300 linesize 500
define Owner=''

select u.TIMESTAMP,
t.last_analyzed,
d.owner,
u.table_name,
u.inserts,
u.updates,
u.deletes,
d.num_rows,
decode(d.num_rows,0,'Table Stats indicate No Rows',
nvl(TO_CHAR(((U.inserts+u.deletes+u.updates)/d.num_rows) * 100,'999.99'),'Null Value in dba_TAB_MODIFICATIONS')) percent
from dba_tables t,dba_TAB_MODIFICATIONS u,dba_tables d
where u.table_name = t.table_name
and d.table_name = t.table_name
--and d.owner not in ('SYS')
--and d.owner in ('MUSER')
--and (u.inserts > 3000 or u.updates > 3000 or u.deletes > 3000)
and u.TIMESTAMP > sysdate -30
--order by t.last_analyzed
order by 1
/






define table_name='TS$'

SET EMBEDDED ON HEADING ON

COLUMN Ts FORMAT a30
COLUMN Ta FORMAT a30
COLUMN Clu FORMAT a30
COLUMN Pcf FORMAT 99999999999990
COLUMN Pcu FORMAT 99999999999990
COLUMN Int FORMAT 99,999,999,990
COLUMN Mat FORMAT 99,999,999,990
COLUMN Inx FORMAT 99,999,999,990
COLUMN Nxt FORMAT 99,999,999,990
COLUMN Mix FORMAT 99,999,999,990
COLUMN Max FORMAT 99,999,999,990
COLUMN Pci FORMAT 99999999999990
COLUMN Num FORMAT 99,999,999,990
COLUMN Blo FORMAT 99,999,999,990
COLUMN Emp FORMAT 99,999,999,990
COLUMN Avg FORMAT 99,999,999,990
COLUMN Cha FORMAT 99,999,999,990
COLUMN Rln FORMAT 99,999,999,990
COLUMN Hdg FORMAT a30 newline
SET HEADING OFF
SELECT 'Table Name' Hdg, table_name Ta,
       'Tablespace_name' Hdg, tablespace_name Ts,
       'Cluster Name' Hdg, cluster_name Clu,
       '% Free' Hdg, Pct_Free Pcf,
       '% Used' Hdg, Pct_Used Pcu,
       'Ini Trans' Hdg, Ini_Trans Int,
       'Max Trans' Hdg, Max_Trans Mat,
       'Initial Extent (K)' Hdg, Initial_Extent/1024 Inx,
       'Next Extent (K)' Hdg, Next_extent/1024 Nxt,
       'Min Extents' Hdg, Min_extents Mix,
       'Max Extents' Hdg, Max_extents Max,
       '% Increase' Hdg, Pct_Increase Pci,
       'Number of Rows' Hdg, Num_Rows Num,
       'Number of Blocks' Hdg, Blocks Blo,
       'Number of Empty Blocks' Hdg, Empty_Blocks Emp,
       'Average Space' Hdg, Avg_Space Avg,
       'Chain Count' Hdg, Chain_Cnt Cha,
       'Average Row Length' Hdg, Avg_Row_len Rln
FROM dba_tables
where 1=1
and  table_name = UPPER('&&table_name')
--and rownum <3
--AND owner=UPPER('tab_owner')
/

Table Name                     TS$
Tablespace_name                SYSTEM
Cluster Name                   C_TS#
% Free                                       0
% Used                                       0
Ini Trans                                    0
Max Trans                                    0
Initial Extent (K)                          64
Next Extent (K)                          1,024
Min Extents                                  1
Max Extents                      2,147,483,645
% Increase
Number of Rows                               6

Number of Blocks                             7
Number of Empty Blocks                       0
Average Space                                0
Chain Count                                  0
Average Row Length                          90


====


 set linesize 300 pagesize 300 
 col COLUMN_NAME for a20 
 col DATA_TYPE for a20 
 col LOW_VALUE for a20 
 col HIGH_VALUE for a20
select column_id
     , column_name
     , data_type
     , num_distinct num_vals
     , num_nulls
     , density dnsty
     , case when data_type = 'NUMBER' then to_char(utl_raw.cast_to_number(low_value))
            when data_type = 'VARCHAR2' then to_char(utl_raw.cast_to_varchar2(low_value))
            when data_type = 'NVARCHAR2' then to_char(utl_raw.cast_to_nvarchar2(low_value))
            when data_type = 'BINARY_DOUBLE' then to_char(utl_raw.cast_to_binary_double(low_value))
            when data_type = 'BINARY_FLOAT' then to_char(utl_raw.cast_to_binary_float(low_value))
            when data_type = 'DATE' or data_type like 'TIMESTAMP%' then rtrim(ltrim(to_char(100*(to_number(substr(low_value,1,2),'XX')-100)
+ (to_number(substr(low_value,3,2),'XX')-100),'0000'))||'-'||
ltrim(to_char(to_number(substr(low_value,5,2),'XX'),'00'))||'-'||
ltrim(to_char(to_number(substr(low_value,7,2),'XX'),'00'))||' '||
ltrim(to_char(to_number(substr(low_value,9,2),'XX')-1,'00'))||':'||
ltrim(to_char(to_number(substr(low_value,11,2),'XX')-1,'00'))||':'||
ltrim(to_char(to_number(substr(low_value,13,2),'XX')-1,'00'))) 
           else utl_raw.cast_to_varchar2(low_value)
           end low_value
     , case when data_type = 'NUMBER' then to_char(utl_raw.cast_to_number(high_value))
            when data_type = 'VARCHAR2' then to_char(utl_raw.cast_to_varchar2(high_value))
            when data_type = 'NVARCHAR2' then to_char(utl_raw.cast_to_nvarchar2(high_value))
            when data_type = 'BINARY_DOUBLE' then to_char(utl_raw.cast_to_binary_double(high_value))
            when data_type = 'BINARY_FLOAT' then to_char(utl_raw.cast_to_binary_float(high_value))
            when data_type = 'DATE' or data_type like 'TIMESTAMP%' then rtrim(ltrim(to_char(100*(to_number(substr(high_value,1,2),'XX')-100)
+ (to_number(substr(high_value,3,2),'XX')-100),'0000'))||'-'||
ltrim(to_char(to_number(substr(high_value,5,2),'XX'),'00'))||'-'||
ltrim(to_char(to_number(substr(high_value,7,2),'XX'),'00'))||' '||
ltrim(to_char(to_number(substr(high_value,9,2),'XX')-1,'00'))||':'||
ltrim(to_char(to_number(substr(high_value,11,2),'XX')-1,'00'))||':'||
ltrim(to_char(to_number(substr(high_value,13,2),'XX')-1,'00'))) 
           else utl_raw.cast_to_varchar2(high_value)
           end high_value
from dba_tab_cols
where owner      = 'SCOTT'
  and table_name = 'EMP'
 -- and column_name = 'XXX'
 ;
 
 
 
 
  COLUMN_ID COLUMN_NAME          DATA_TYPE              NUM_VALS  NUM_NULLS      DNSTY LOW_VALUE            HIGH_VALUE
---------- -------------------- -------------------- ---------- ---------- ---------- -------------------- --------------------
         1 EMPNO                NUMBER                       14          0 .071428571 7369                 7934
         2 ENAME                VARCHAR2                     14          0 .071428571 ADAMS                WARD
         3 JOB                  VARCHAR2                      5          0         .2 ANALYST              SALESMAN
         4 MGR                  NUMBER                        6          1 .166666667 7566                 7902
         5 HIREDATE             DATE                         13          0 .076923077 1980-12-17 00:00:00  1987-05-23 00:00:00
         6 SAL                  NUMBER                       12          0 .083333333 800                  5000
         7 COMM                 NUMBER                        6          8 .166666667 0                    1400
         8 DEPTNO               NUMBER                        3          0 .333333333 10                   30

8 rows selected.




								

set linesize 300 pagesize 300
col OWNER       for a20                                                                                                                      
col TABLE_NAME for a27
col PARTITION_NAME for a20 
col SUBPARTITION_NAME for a20
col STATS_UPDATE_TIME for a35 
select * from  dba_TAB_STATS_HISTORY where 1=1
and OWNER ='XXX'
order by 2;



select min(STATS_UPDATE_TIME), max(STATS_UPDATE_TIME)
from  dba_TAB_STATS_HISTORY where 1=1
and OWNER ='XXX'




declare
mystaleobjs dbms_stats.objecttab;
begin
-- check whether there is any stale objects
dbms_stats.gather_schema_stats(ownname=>'ANUJ', options=>'LIST STALE',objlist=>mystaleobjs);
for i in 1 .. mystaleobjs.count loop
dbms_output.put_line(mystaleobjs(i).objname); 
end loop;
end;
/




SET SERVEROUTPUT ON

DECLARE
ObjList dbms_stats.ObjectTab;
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(ownname=> 'ANUJ', objlist=> ObjList, options=> 'LIST STALE');
FOR i in ObjList.FIRST..ObjList.LAST
LOOP
dbms_output.put_line(ObjList(i).ownname || '.' || ObjList(i).ObjName || ' ' || ObjList(i).ObjType || ' ' || ObjList(i).partname);
END LOOP;
END;
/


	   
set lines 300 pages 300
col table_name 		for a40
col owner 			for a20 
col partition_name 	for a25
col stale_stats 	for a14
col stattype_locked for a15
select distinct owner, table_name, partition_name,num_rows, stale_stats,NUM_ROWS, last_analyzed, stattype_locked   from dba_tab_statistics
where 1=1
--and table_name=:h
and owner='XXX'
and stattype_locked is not null
;

set lines 300 pages 300 numf 999999999999999999999999
col table_name          for a40
col owner               for a20
col partition_name   	for a25
 col stale_stats    	for a14
 col stattype_locked 	for a15
 select distinct owner, table_name, partition_name, stale_stats,num_rows, last_analyzed, stattype_locked   from dba_tab_statistics
 where 1=1
 --and table_name=:h
 and owner='XXX'
 and STALE_STATS!='NO'
 --and stattype_locked is not null
 --and NUM_ROWS>1000
 ;



*************************************************************************

https://anuj-singh.blogspot.com/2011/11/oracle-count-number-of-rows-in-tables.html?m=1


oracle partition row count


define table_owner='USER2'
define TABLE_NAME='SALES'

set serverout on size 1000000
set verify off
declare
sql_stmt varchar2(1024);
row_count number;
cursor get_tab is
select table_name,partition_name
from dba_tab_partitions
where table_owner=upper('&&TABLE_OWNER') 
and table_name='&&TABLE_NAME'
;
begin
dbms_output.put_line('Checking Record Counts for table_name');
dbms_output.put_line('Log file to numrows_part_&&TABLE_OWNER.lst ....');
dbms_output.put_line('....');
for get_tab_rec in get_tab loop
BEGIN
sql_stmt := 'select count(*) from &&TABLE_OWNER..'||get_tab_rec.table_name||' partition ( '||get_tab_rec.partition_name||' )';

EXECUTE IMMEDIATE sql_stmt INTO row_count;
dbms_output.put_line('Table '||rpad(get_tab_rec.table_name||'('||get_tab_rec.partition_name||')',50)||' '||TO_CHAR(row_count)||' rows.');
exception when others then
dbms_output.put_line
('Error counting rows for table '||get_tab_rec.table_name);
END;
end loop;
end;
/
set verify on


Table SALES(SALES_AUG)                                   0 rows.
Table SALES(SALES_DEV)                                   0 rows.
Table SALES(SALES_NOV)                                   1 rows.
Table SALES(SALES_OCT)                                   0 rows.
Table SALES(SALES_SEP)                                   0 rows.

PL/SQL procedure successfully completed.


*********************************

table name with digit !!

set linesize 300 pagesize 300
col owner for a20 
select owner ,
       table_name
from sys.dba_tables
where regexp_like (table_name, '[0-9]') 
-- excluding some Oracle maintained schemas
and owner not in ('ANONYMOUS','CTXSYS','DBSNMP','EXFSYS', 'LBACSYS', 
   'MDSYS', 'MGMT_VIEW','OLAPSYS','OWBSYS','ORDPLUGINS', 'ORDSYS','OUTLN', 
   'SI_INFORMTN_SCHEMA','SYS','SYSMAN','SYSTEM', 'TSMSYS','WK_TEST',
   'WKPROXY','WMSYS','XDB','APEX_040000','APEX_030200', 'APEX_PUBLIC_USER','DIP', 
   'FLOWS_30000','FLOWS_FILES','MDDATA', 'ORACLE_OCM', 'XS$NULL',
   'SPATIAL_CSW_ADMIN_USR', 'SPATIAL_WFS_ADMIN_USR', 'PUBLIC', 'WKSYS')
order by owner,     table_name;

====


---!from Web 

define 1='xxx'  -- table name 
define 2='xx'  --- owner


set echo off feed off termout off
set linesize 180 trimspool on
set pagesize 60

repheader off
ttitle off

col num_rows                format a6                   heading 'Num|rows'                  justify right
col avg_row_len             format 9999                 heading 'Avg|len'
col blocks                  format a6                   heading 'Blocks'                    justify right
col seg_size                format 999999999.99              heading 'Segment|GB'
col sample_size             format a6                   heading 'Sample'                    justify right
col user_stats              format a5                   heading 'User|stats'
col temporary               format a2                   heading 'Te|mp'
col degree                  format a3                   heading 'DOP'
col partitioned             format a3                   heading 'Partitioned'
col iot_type                format a3                   

col data_type               format a15                  truncate
col avg_col_len             format 9999                 heading 'Avg|len'
col num_distinct            format a6                   heading 'Num di|stinct'
col density                 format 9.99EEEE
col num_nulls               format a6                   heading 'Num|nulls'                 justify right
col num_buckets             format 999                  heading 'Buck|ets'
col low_value               format a20                                                      trunc
col high_value              format a20                                                      trunc

col index_name              format a30                  
col column_name             format a30                  truncate
col prefix_length           format 99                   heading 'Pre|fix'
col avg_leaf_blocks_per_key format 999,999              heading 'Leafs|per key'
col avg_data_blocks_per_key format 999,999              heading 'Data|per key'
col clustering_factor       format a6                   heading 'Cluste|ring'               justify right
col blevel                  format 99                   heading 'BLev'
col leaf_blocks             format a6                   heading 'Leaf|blocks'               justify right
col distinct_keys           format 999,999,999          heading 'Distinct|keys'
col rows_per_key            format 999,999,999          heading 'Rows per key'

col DENSITY for 9999999999999999999

col p1 new_value 1
col p2 new_value 2
select null p1, null p2 from dual where 1 = 2;



var tab_name varchar2(30)
var owner varchar2(30)
exec :tab_name := upper('&1');
exec :owner := case when upper('&2') is null then user else upper('&2') end;

set termout on

ttitle left 'Table statistics'

select 
table_name,
lpad(case when num_rows < 1e5 then num_rows || ' '
                 when num_rows < 1e8 then round(num_rows / 1e3) || 'K'
                 when num_rows < 1e11 then round(num_rows / 1e6) || 'M'
                 else round(num_rows / 1e9) || 'G'
            end, 6, ' '
       ) num_rows
     , avg_row_len
     , lpad(case when blocks < 1e5 then blocks || ' '
                 when blocks < 1e8 then round(blocks / 1e3) || 'K'
                 when blocks < 1e11 then round(blocks / 1e6) || 'M'
                 else round(blocks / 1e9) || 'G'
            end, 6, ' '
       ) blocks
     , (select sum(bytes)/1024/1024/1024 from dba_segments where segment_name = table_name and owner = :owner) seg_size
     , lpad(case when sample_size < 1e5 then sample_size || ' '
                 when sample_size < 1e8 then round(sample_size / 1e3) || 'K'
                 when sample_size < 1e11 then round(sample_size / 1e6) || 'M'
                 else round(sample_size / 1e9) || 'G'
            end, 6, ' '
       ) sample_size
     , last_analyzed
     , user_stats
     , temporary
     , compression
     , substr(replace(degree, ' '), 1, 3) degree
     , partitioned
     , iot_type
  from dba_tables t 
 where table_name = :tab_name
   and owner = :owner;

ttitle left "Column statistics"

select column_name
     , avg_col_len
     , data_type || decode(data_type, 'NUMBER', '(' || data_precision || decode(data_scale, 0, null, ',' || data_scale) || ')'
                                    , 'VARCHAR2', '(' || data_length || ')'
                                    , null
       ) data_type
     , lpad(case when num_distinct < 1e5 then num_distinct || ' '
                 when num_distinct < 1e8 then round(num_distinct / 1e3) || 'K'
                 when num_distinct < 1e11 then round(num_distinct / 1e6) || 'M'
                 else round(num_distinct / 1e9) || 'G'
            end, 6, ' '
       ) num_distinct
     , density
     , lpad(case when num_nulls < 1e5 then num_nulls || ' '
                 when num_nulls < 1e8 then round(num_nulls / 1e3) || 'K'
                 when num_nulls < 1e11 then round(num_nulls / 1e6) || 'M'
                 else round(num_nulls / 1e9) || 'G'
            end, 6, ' '
       ) num_nulls
     , num_buckets
     , user_stats
     , lpad(case when sample_size < 1e5 then sample_size || ' '
                 when sample_size < 1e8 then round(sample_size / 1e3) || 'K'
                 when sample_size < 1e11 then round(sample_size / 1e6) || 'M'
                 else round(sample_size / 1e9) || 'G'
            end, 6, ' '
       ) sample_size
     , decode(data_type, 'NUMBER', to_char(utl_raw.cast_to_number(low_value)),
                         'VARCHAR2', utl_raw.cast_to_varchar2(low_value),
                         'CHAR', utl_raw.cast_to_varchar2(low_value)
       ) low_value
     , decode(data_type, 'NUMBER', to_char(utl_raw.cast_to_number(high_value)),
                         'VARCHAR2', utl_raw.cast_to_varchar2(high_value),
                         'CHAR', utl_raw.cast_to_varchar2(high_value)
       ) high_value
  from dba_tab_cols
 where table_name = :tab_name
   and owner = :owner
 order by column_id;
 
ttitle left Histogram data for NUMBER columns
select *
  from dba_tab_histograms h
 where 1=0
  

ttitle left "Index statistics"
break on index_name skip 1

select ui.index_name
     , uic.column_name
     , prefix_length
     , blevel
     , lpad(case when leaf_blocks < 1e5 then leaf_blocks || ' '
                 when leaf_blocks < 1e8 then round(leaf_blocks / 1e3) || 'K'
                 when leaf_blocks < 1e11 then round(leaf_blocks / 1e6) || 'M'
                 else round(leaf_blocks / 1e9) || 'G'
            end, 6, ' '
       ) leaf_blocks
     , avg_leaf_blocks_per_key
     , avg_data_blocks_per_key
--     , distinct_keys
     , (num_rows / nullif(distinct_keys, 0)) rows_per_key
     , lpad(case when num_rows < 1e5 then num_rows || ' '
                 when num_rows < 1e8 then round(num_rows / 1e3) || 'K'
                 when num_rows < 1e11 then round(num_rows / 1e6) || 'M'
                 else round(num_rows / 1e9) || 'G'
            end, 6, ' '
       ) num_rows
     , lpad(case when clustering_factor < 1e5 then clustering_factor || ' '
                 when clustering_factor < 1e8 then round(clustering_factor / 1e3) || 'K'
                 when clustering_factor < 1e11 then round(clustering_factor / 1e6) || 'M'
                 else round(clustering_factor / 1e9) || 'G'
            end, 6, ' '
       ) clustering_factor
     , lpad(case when sample_size < 1e5 then sample_size || ' '
                 when sample_size < 1e8 then round(sample_size / 1e3) || 'K'
                 when sample_size < 1e11 then round(sample_size / 1e6) || 'M'
                 else round(sample_size / 1e9) || 'G'
            end, 6, ' '
       ) sample_size
     , user_stats
     , substr(replace(degree, ' '), 1, 3) degree
     , last_analyzed
  from dba_indexes ui
     , dba_ind_columns uic
 where ui.table_name = :tab_name
   and ui.owner = :owner
   and ui.index_name = uic.index_name
   and ui.table_name = uic.table_name
 order by index_name, column_position;


====



set pagesize 50000 linesize 200 trimspool on  long 2000000  long 2000000
col ddl format a100

define v_owner='SCOTT'
define v_table_name='EMP'


var v_owner varchar2(30)
var v_table_name varchar2(30)

begin
	:v_owner := '&&v_owner';
	:v_table_name := '&&v_table_name';
end;
/


col v_owner new_value v_owner noprint
col v_table_name new_value v_table_name noprint

begin
	dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PRETTY',TRUE);
	dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',TRUE);
	dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES',TRUE);
	dbms_metadata.set_transform_param(dbms_metadata.session_transform,'STORAGE', TRUE);
	dbms_metadata.set_transform_param(dbms_metadata.session_transform,'TABLESPACE',TRUE);
	dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SPECIFICATION',TRUE);
	dbms_metadata.set_transform_param(dbms_metadata.session_transform,'BODY',TRUE);
	dbms_metadata.set_transform_param(dbms_metadata.session_transform,'CONSTRAINTS',TRUE);
end;
/


prompt --########################################
prompt --## TABLE DDL
prompt --########################################

select replace(dbms_metadata.get_ddl('TABLE',:v_table_name,:v_owner),'"','') ddl from dual
/

prompt --########################################
prompt --## INDEX DDL
prompt --########################################

select replace(dbms_metadata.get_ddl('INDEX',i.index_name, i.owner),'"','') ddl
from dba_indexes i
where i.owner = :v_owner
and i.table_name = :v_table_name
/

prompt --########################################
prompt --## PRIMARY KEY
prompt --########################################

select replace(dbms_metadata.get_ddl('CONSTRAINT',c.constraint_name, c.owner),'"','') ddl
from dba_constraints c
where c.owner = :v_owner
and c.table_name = :v_table_name
and c.constraint_type = 'P'
/

prompt --########################################
prompt --## FOREIGN KEYS
prompt --########################################

select replace(dbms_metadata.get_ddl('REF_CONSTRAINT',c.constraint_name, c.owner),'"','') ddl
from dba_constraints c
where c.owner = :v_owner
and c.table_name = :v_table_name
and c.constraint_type = 'R'
/

prompt --########################################
prompt --## CHECK CONSTRAINTS
prompt --########################################

select replace(dbms_metadata.get_ddl('CONSTRAINT',c.constraint_name, c.owner),'"','') ddl
from dba_constraints c
where c.owner = :v_owner
and c.table_name = :v_table_name
and c.constraint_type = 'C'
--and c.generated not like 'GENERATED%'
/

undef 1 2









set linesize 200 trimspool on  pagesize 100

col owner format a30 head 'Owner'
col segment_type format a7 head 'Segment|Type'
 col ini_trans format 999 head 'ITL'
 col ini_trans_count format 99,999 head 'ITL|Count'

 break on owner skip 1 on segment_type

 with data as (
    select owner, 'Table' segment_type,      nvl(ini_trans,0) ini_trans
    from dba_tables
    union all
    select table_owner, 'TabPart' segment_type,     nvl(ini_trans,0) ini_trans
    from dba_tab_partitions
    union all
    select table_owner, 'TabSubPart' segment_type,  nvl(ini_trans,0) ini_trans
    from dba_tab_subpartitions
    union all
    select owner, 'Index' segment_type,      nvl(ini_trans,0) ini_trans
    from dba_indexes
    union all
    select index_owner, 'IndPart' segment_type,     nvl(ini_trans,0) ini_trans
    from dba_ind_partitions
    union all
    select index_owner, 'IndSubPart' segment_type,  nvl(ini_trans,0) ini_trans
    from dba_ind_subpartitions
)
 select owner, segment_type, ini_trans, count(*) ini_trans_count
 from data d
join dba_users u on u.username = d.owner
and u.oracle_maintained = 'N' --------------------------------- <<<<<<------
   group by owner, segment_type, ini_trans
   order by owner, segment_type, ini_trans
/ 



                               Segment          ITL
Owner                          Type     ITL   Count
------------------------------ ------- ---- -------
ANUJXX_TEST                    IndPart    2      30
                               Index      0       3
                               TabPart    1      10
                               Table      0       1




-- Partition count info 

define 1 ='XXXX';  ---owner 

define 2 ='XX';   --Table_name 

set serveroutput on

declare

p_count number;

begin
for i in (select table_name,table_owner,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION from dba_tab_partitions where table_owner='&1' and table_name='&2' order by PARTITION_POSITION) loop
execute immediate 'select /*+ parallel(112) */ count(*) from '||i.table_owner||'.'||i.table_name||' partition('||i.PARTITION_NAME||')' into p_count;
dbms_output.put_line(substr(i.table_name,1,15)||' '|| substr(i.table_owner,1,15)||'  ' ||to_char(i.HIGH_VALUE)||'  ' ||i.PARTITION_NAME||'  '||i.PARTITION_POSITION ||'  '||to_char(p_count));
end loop;
end ;







BEGIN  
dbms_stats.gather_table_stats
(ownname => 'ANUJ'  
tabname =>'table1',  
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, 
cascade => DBMS_STATS.AUTO_CASCADE,  
method_opt => 'FOR ALL COLUMNS SIZE AUTO',  
degree => DBMS_STATS.DEFAULT_DEGREE); 
END;




Oracle DBA

anuj blog Archive