---------------------------------------------------------------------------------------- -- -- File name: cs_table.sql -- -- Purpose: Table Details -- -- Author: Carlos Sierra -- -- Version: 2023/01/20 -- -- Usage: Execute connected to PDB. -- -- Enter table owner and table name when requested. -- -- Example: $ sqlplus / as sysdba -- SQL> @cs_table.sql -- -- Notes: Developed and tested on 12.1.0.2. -- --------------------------------------------------------------------------------------- -- @@cs_internal/cs_primary.sql @@cs_internal/cs_cdb_warn.sql @@cs_internal/cs_set.sql @@cs_internal/cs_def.sql @@cs_internal/cs_file_prefix.sql -- DEF cs_script_name = 'cs_table'; -- COL owner NEW_V owner FOR A30 HEA 'TABLE_OWNER'; SELECT DISTINCT t.owner FROM dba_tables t, dba_users u WHERE u.username = t.owner AND u.oracle_maintained = 'N' AND u.username NOT LIKE 'C##'||CHR(37) ORDER BY 1 / COL table_owner NEW_V table_owner FOR A30; PRO PRO 1. Table Owner: DEF table_owner = '&1.'; UNDEF 1; SELECT UPPER(TRIM(NVL('&&table_owner.', '&&owner.'))) table_owner FROM DUAL / -- COL name NEW_V name FOR A30 HEA 'TABLE_NAME'; COL num_rows FOR 99,999,999,990; COL blocks FOR 99,999,999,990; COL rows_per_block FOR 999,990.0; COL avg_row_len FOR 999,990; COL lobs FOR 9990; SELECT t.table_name name, t.num_rows, t.blocks, ROUND(t.num_rows / NULLIF(t.blocks, 0), 1) AS rows_per_block, t.avg_row_len, (SELECT COUNT(*) FROM dba_lobs l WHERE l.owner = t.owner AND l.table_name = t.table_name) AS lobs, t.partitioned FROM dba_tables t, dba_users u WHERE t.owner = UPPER(TRIM('&&table_owner.')) AND u.username = t.owner AND u.oracle_maintained = 'N' AND u.username NOT LIKE 'C##'||CHR(37) ORDER BY 1 / PRO PRO 2. Table Name: DEF table_name = '&2.'; UNDEF 2; COL table_name NEW_V table_name; SELECT UPPER(TRIM(NVL('&&table_name.', '&&name.'))) table_name FROM DUAL; -- SELECT '&&cs_file_prefix._&&cs_script_name._&&table_owner..&&table_name.' cs_file_name FROM DUAL; -- @@cs_internal/cs_spool_head.sql PRO SQL> @&&cs_script_name..sql "&&table_owner." "&&table_name." @@cs_internal/cs_spool_id.sql -- PRO TABLE_OWNER : &&table_owner. PRO TABLE_NAME : &&table_name. -- DEF specific_owner = '&&table_owner.'; DEF specific_table = '&&table_name.'; DEF order_by = 't.owner, t.table_name'; DEF fetch_first_N_rows = '1'; PRO PRO SUMMARY &&table_owner..&&table_name. PRO ~~~~~~~ @@cs_internal/cs_tables_internal.sql -- COL owner FOR A30 HEA 'Owner' TRUNC; COL segment_name FOR A30 TRUNC; COL partition_name FOR A30 TRUNC; COL column_name FOR A30 TRUNC; COL segments FOR 9,999,990; -- COL mebibytes FOR 999,999,990.000 HEA 'Size MiB'; COL megabytes FOR 999,999,990.000 HEA 'Size MB'; COL tablespace_name FOR A30 HEA 'Tablespace'; BREAK ON REPORT; COMPUTE SUM LABEL 'TOTAL' OF mebibytes megabytes segments ON REPORT; -- PRO PRO SEGMENTS (dba_segments) top 100 &&table_owner..&&table_name. PRO ~~~~~~~~ WITH t AS ( SELECT owner, table_name FROM dba_tables WHERE owner = '&&table_owner.' AND table_name = '&&table_name.' ), s AS ( SELECT 1 AS oby, s.segment_type, s.owner, s.segment_name, s.partition_name, NULL AS column_name, s.bytes, s.tablespace_name FROM t, dba_segments s WHERE s.owner = t.owner AND s.segment_name = t.table_name AND s.segment_type LIKE 'TABLE%' UNION ALL SELECT 2 AS oby, s.segment_type, s.owner, s.segment_name, s.partition_name, NULL AS column_name, s.bytes, s.tablespace_name FROM t, dba_indexes i, dba_segments s WHERE i.table_owner = t.owner AND i.table_name = t.table_name AND s.owner = i.owner AND s.segment_name = i.index_name AND s.segment_type LIKE 'INDEX%' UNION ALL SELECT 3 AS oby, s.segment_type, s.owner, s.segment_name, s.partition_name, l.column_name, s.bytes, s.tablespace_name FROM t, dba_lobs l, dba_segments s WHERE l.owner = t.owner AND l.table_name = t.table_name AND s.owner = l.owner AND s.segment_name = l.segment_name AND s.segment_type LIKE 'LOB%' ) --SELECT ROUND(bytes/POWER(2,20),3) AS mebibytes, segment_type, owner, column_name, segment_name, partition_name, tablespace_name SELECT ROUND(bytes/POWER(10,6),3) AS megabytes, segment_type, owner, column_name, segment_name, partition_name, tablespace_name FROM s ORDER BY bytes DESC, oby, segment_type, owner, column_name, segment_name, partition_name FETCH FIRST 100 ROWS ONLY / -- PRO PRO SEGMENT TYPE (dba_segments) &&table_owner..&&table_name. PRO ~~~~~~~~~~~~ WITH t AS ( SELECT owner, table_name FROM dba_tables WHERE owner = '&&table_owner.' AND table_name = '&&table_name.' ), s AS ( SELECT 1 AS oby, s.segment_type, s.owner, s.segment_name, s.partition_name, NULL AS column_name, s.bytes, s.tablespace_name FROM t, dba_segments s WHERE s.owner = t.owner AND s.segment_name = t.table_name AND s.segment_type LIKE 'TABLE%' UNION ALL SELECT 2 AS oby, s.segment_type, s.owner, s.segment_name, s.partition_name, NULL AS column_name, s.bytes, s.tablespace_name FROM t, dba_indexes i, dba_segments s WHERE i.table_owner = t.owner AND i.table_name = t.table_name AND s.owner = i.owner AND s.segment_name = i.index_name AND s.segment_type LIKE 'INDEX%' UNION ALL SELECT 3 AS oby, s.segment_type, s.owner, s.segment_name, s.partition_name, l.column_name, s.bytes, s.tablespace_name FROM t, dba_lobs l, dba_segments s WHERE l.owner = t.owner AND l.table_name = t.table_name AND s.owner = l.owner AND s.segment_name = l.segment_name AND s.segment_type LIKE 'LOB%' ) --SELECT segment_type, COUNT(*) AS segments, ROUND(SUM(bytes)/POWER(2,20),3) AS mebibytes, tablespace_name SELECT segment_type, COUNT(*) AS segments, ROUND(SUM(bytes)/POWER(10,6),3) AS megabytes, tablespace_name FROM s GROUP BY oby, segment_type, tablespace_name ORDER BY oby, segment_type, tablespace_name / -- CLEAR BREAK COMPUTE; -- COL partitioned FOR A4 HEA 'Part'; COL degree FOR A10 HEA 'Degree'; COL temporary FOR A4 HEA 'Temp'; COL blocks FOR 999,999,990 HEA 'Blocks'; COL num_rows FOR 999,999,999,990 HEA 'Num Rows'; COL avg_row_len FOR 999,999,990 HEA 'Avg Row Len'; COL size_MiB FOR 999,999,990.000 HEA 'Size MiB'; COL seg_size_MiB FOR 999,999,990.000 HEA 'Seg Size MiB'; COL estimated_MiB FOR 999,999,990.000 HEA 'Estimated MiB'; COL size_MB FOR 999,999,990.000 HEA 'Size MB'; COL seg_size_MB FOR 999,999,990.000 HEA 'Seg Size MB'; COL estimated_MB FOR 999,999,990.000 HEA 'Estimated MB'; COL sample_size FOR 999,999,999,990 HEA 'Sample Size'; COL last_analyzed FOR A19 HEA 'Last Analyzed'; COL compression FOR A12 HEA 'Compression'; COL tablespace_name FOR A30 HEA 'Tablespace'; -- PRO PRO TABLES (dba_tables) &&table_owner..&&table_name. PRO ~~~~~~ SELECT CASE t.partitioned WHEN 'YES' THEN (SELECT TRIM(TO_CHAR(COUNT(*))) FROM dba_tab_partitions tp WHERE tp.table_owner = t.owner AND tp.table_name = t.table_name) ELSE t.partitioned END AS partitioned, t.degree, t.temporary, t.blocks, --t.blocks * COALESCE(b.block_size, TO_NUMBER(p.value)) / POWER(2,20) AS size_MiB, t.blocks * COALESCE(b.block_size, TO_NUMBER(p.value)) / POWER(10,6) AS size_MB, --(SELECT SUM(s.bytes) / POWER(2,20) FROM dba_segments s WHERE s.owner = t.owner AND s.segment_name = t.table_name AND s.segment_type LIKE 'TABLE%') AS seg_size_MiB, (SELECT SUM(s.bytes) / POWER(10,6) FROM dba_segments s WHERE s.owner = t.owner AND s.segment_name = t.table_name AND s.segment_type LIKE 'TABLE%') AS seg_size_MB, t.num_rows, t.avg_row_len, --t.num_rows * t.avg_row_len / POWER(2,20) AS estimated_MiB, t.num_rows * t.avg_row_len / POWER(10,6) AS estimated_MB, t.sample_size, TO_CHAR(t.last_analyzed, '&&cs_datetime_full_format.') AS last_analyzed, t.compression, t.tablespace_name FROM dba_tables t, dba_tablespaces b, v$parameter p WHERE t.owner = '&&table_owner.' AND t.table_name = '&&table_name.' AND b.tablespace_name(+) = t.tablespace_name AND p.name = 'db_block_size' / -- COL analyzetime FOR A19 HEA 'Analyze Time'; COL rowcnt FOR 999,999,999,990 HEA 'Row Count'; COL blkcnt FOR 999,999,990 HEA 'Block Count'; COL avgrln FOR 999,999,990 HEA 'Avg Row Len'; COL samplesize FOR 999,999,999,990 HEA 'Sample Size'; COL rows_inc FOR 999,999,999,990 HEA 'Rows Increase'; COL days_gap FOR 999,990.0 HEA 'Days Gap'; COL monthly_growth_perc FOR 999,990.000 HEA 'Monthly Growth Perc%'; -- PRO PRO CBO STAT TABLE HISTORY (wri$_optstat_tab_history and dba_tables) &&table_owner..&&table_name. PRO ~~~~~~~~~~~~~~~~~~~~~~ WITH cbo_hist AS ( SELECT h.analyzetime, h.rowcnt, h.blkcnt, h.avgrln, h.samplesize FROM dba_objects o, wri$_optstat_tab_history h WHERE o.owner = '&&table_owner.' AND o.object_name = '&&table_name.' AND o.object_type = 'TABLE' AND h.obj# = o.object_id AND h.analyzetime IS NOT NULL UNION SELECT t.last_analyzed AS analyzetime, t.num_rows AS rowcnt, t.blocks AS blkcnt, t.avg_row_len AS avgrln, t.sample_size AS samplesize FROM dba_tables t WHERE t.owner = '&&table_owner.' AND t.table_name = '&&table_name.' ), cbo_hist_extended AS ( SELECT h.analyzetime, h.rowcnt, h.blkcnt, h.avgrln, h.samplesize, h.rowcnt - LAG(h.rowcnt) OVER (ORDER BY h.analyzetime) AS rows_inc, h.analyzetime - LAG(h.analyzetime) OVER (ORDER BY h.analyzetime) AS days_gap, 100 * (365.25 / 12) * (h.rowcnt - LAG(h.rowcnt) OVER (ORDER BY h.analyzetime)) / NULLIF((h.analyzetime - LAG(h.analyzetime) OVER (ORDER BY h.analyzetime)), 0) / NULLIF(h.rowcnt, 0) AS monthly_growth_perc FROM cbo_hist h ) SELECT TO_CHAR(h.analyzetime, '&&cs_datetime_full_format.') AS analyzetime, h.blkcnt, h.rowcnt, h.rows_inc, h.days_gap, h.monthly_growth_perc, h.avgrln, h.samplesize FROM cbo_hist_extended h ORDER BY 1 / PRO PRO GROWTH (wri$_optstat_tab_history and dba_tables) &&table_owner..&&table_name. PRO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ WITH oldest AS ( SELECT h.analyzetime, h.rowcnt FROM dba_objects o, wri$_optstat_tab_history h WHERE o.owner = '&&table_owner.' AND o.object_name = '&&table_name.' AND o.object_type = 'TABLE' AND h.obj# = o.object_id AND h.analyzetime IS NOT NULL AND h.rowcnt > 0 ORDER BY h.analyzetime FETCH FIRST 1 ROW ONLY ), newest AS ( SELECT t.last_analyzed AS analyzetime, t.num_rows AS rowcnt FROM dba_tables t WHERE t.owner = '&&table_owner.' AND t.table_name = '&&table_name.' AND t.num_rows > 0 AND ROWNUM = 1 ) SELECT 100 * (365 / 12) * (n.rowcnt - o.rowcnt) / (n.analyzetime - o.analyzetime) / o.rowcnt AS monthly_growth_perc FROM oldest o, newest n WHERE n.analyzetime > o.analyzetime / -- COL object_type HEA 'Object Type' FOR A30; COL object_id FOR 999999999 HEA 'Object ID'; COL object_name FOR A30 HEA 'Object Name' TRUNC; COL subobject_name FOR A30 HEA 'Sub Object Name' TRUNC; COL created FOR A23 HEA 'Created'; COL last_ddl_time FOR A23 HEA 'Last DDL Time'; -- PRO PRO TABLE OBJECTS (dba_objects) up to 100 &&table_owner..&&table_name. PRO ~~~~~~~~~~~~~ SELECT o.object_type, o.subobject_name, o.object_id, TO_CHAR(o.created, '&&cs_datetime_full_format.') AS created, TO_CHAR(o.last_ddl_time, '&&cs_datetime_full_format.') AS last_ddl_time FROM dba_objects o WHERE o.owner = '&&table_owner.' AND o.object_name = '&&table_name.' AND o.object_type LIKE 'TABLE%' ORDER BY o.object_type, o.object_id FETCH FIRST 100 ROWS ONLY / -- COL index_name FOR A30 HEA 'Index Name'; COL partitioned FOR A4 HEA 'Part'; COL orphaned_entries FOR A8 HEA 'Orphaned|Entries'; COL degree FOR A10 HEA 'Degree'; COL index_type FOR A27 HEA 'Index Type'; COL uniqueness FOR A10 HEA 'Uniqueness'; COL columns FOR 999,999 HEA 'Columns'; COL status FOR A8 HEA 'Status'; COL visibility FOR A10 HEA 'Visibility'; COL blevel FOR 99,990 HEA 'BLevel'; COL leaf_blocks FOR 999,999,990 HEA 'Leaf Blocks'; COL size_MiB FOR 999,999,990.000 HEA 'Size MiB'; COL seg_size_MiB FOR 999,999,990.000 HEA 'Seg Size MiB'; COL size_MB FOR 999,999,990.000 HEA 'Size MB'; COL seg_size_MB FOR 999,999,990.000 HEA 'Seg Size MB'; COL distinct_keys FOR 999,999,999,990 HEA 'Dist Keys'; COL clustering_factor FOR 999,999,999,990 HEA 'Clust Fact'; COL num_rows FOR 999,999,999,990 HEA 'Num Rows'; COL sample_size FOR 999,999,999,990 HEA 'Sample Size'; COL last_analyzed FOR A19 HEA 'Last Analyzed'; COL compression FOR A13 HEA 'Compression'; COL tablespace_name FOR A30 HEA 'Tablespace'; -- PRO PRO INDEXES (dba_indexes) &&table_owner..&&table_name. PRO ~~~~~~~ SELECT i.index_name, CASE i.partitioned WHEN 'YES' THEN (SELECT TRIM(TO_CHAR(COUNT(*))) FROM dba_ind_partitions ip WHERE ip.index_owner = i.owner AND ip.index_name = i.index_name) ELSE i.partitioned END AS partitioned, i.orphaned_entries, i.degree, i.index_type, i.uniqueness, (SELECT COUNT(*) FROM dba_ind_columns ic WHERE ic.index_owner = i.owner AND ic.index_name = i.index_name) AS columns, i.status, i.visibility, i.blevel, i.leaf_blocks, --i.leaf_blocks * COALESCE(b.block_size, TO_NUMBER(p.value)) / POWER(2,20) AS size_MiB, i.leaf_blocks * COALESCE(b.block_size, TO_NUMBER(p.value)) / POWER(10,6) AS size_MB, --(SELECT SUM(s.bytes) / POWER(2,20) FROM dba_segments s WHERE s.owner = i.owner AND s.segment_name = i.index_name AND s.segment_type LIKE 'INDEX%') AS seg_size_MiB, (SELECT SUM(s.bytes) / POWER(10,6) FROM dba_segments s WHERE s.owner = i.owner AND s.segment_name = i.index_name AND s.segment_type LIKE 'INDEX%') AS seg_size_MB, i.distinct_keys, i.clustering_factor, i.num_rows, i.sample_size, TO_CHAR(i.last_analyzed, '&&cs_datetime_full_format.') AS last_analyzed, i.compression, i.tablespace_name FROM dba_indexes i, dba_tablespaces b, v$parameter p WHERE i.table_owner = '&&table_owner.' AND i.table_name = '&&table_name.' AND b.tablespace_name(+) = i.tablespace_name AND p.name = 'db_block_size' ORDER BY i.index_name / -- PRO PRO INDEX OBJECTS (dba_objects) up to 100 &&table_owner..&&table_name. PRO ~~~~~~~~~~~~~ SELECT o.object_type, o.object_name, o.subobject_name, o.object_id, TO_CHAR(o.created, '&&cs_datetime_full_format.') AS created, TO_CHAR(o.last_ddl_time, '&&cs_datetime_full_format.') AS last_ddl_time FROM dba_indexes i, dba_objects o WHERE i.table_owner = '&&table_owner.' AND i.table_name = '&&table_name.' AND o.owner = i.owner AND o.object_name = i.index_name AND o.object_type LIKE 'INDEX%' ORDER BY o.object_type, o.object_name, o.subobject_name FETCH FIRST 100 ROWS ONLY / -- COL part_sub FOR A12 HEA 'LEVEL'; COL object_type FOR A5 HEA 'TYPE'; COL owner FOR A30 HEA 'Owner' TRUNC; COL name FOR A30 HEA 'Name' TRUNC; COL column_position FOR 999 HEA 'POS'; COL column_name FOR A30 TRUNC; -- PRO PRO PARTITION KEYS (dba_part_key_columns and dba_subpart_key_columns) &&table_owner..&&table_name. PRO ~~~~~~~~~~~~~~ -- WITH /* PART_KEY_COLUMNS */ dba_tables_m AS ( SELECT /*+ MATERIALIZE NO_MERGE QB_NAME(dba_tables) */ t.owner, t.table_name FROM dba_tables t WHERE t.owner = '&&table_owner.' AND t.table_name = '&&table_name.' ), dba_indexes_m AS ( SELECT /*+ MATERIALIZE NO_MERGE QB_NAME(dba_indexes) */ i.owner, i.index_name FROM dba_tables_m t, dba_indexes i WHERE i.table_owner = t.owner AND i.table_name = t.table_name ), objects_m AS ( SELECT owner, table_name AS name, 'TABLE' AS object_type FROM dba_tables_m UNION SELECT owner, index_name AS name, 'INDEX' AS object_type FROM dba_indexes_m ) SELECT 'PARTITION' AS part_sub, p.object_type, p.owner, p.name, p.column_position, p.column_name FROM dba_part_key_columns p, objects_m o WHERE o.owner = p.owner AND o.name = p.name AND o.object_type = p.object_type UNION ALL SELECT 'SUBPARTITION' AS part_sub, p.object_type, p.owner, p.name, p.column_position, p.column_name FROM dba_subpart_key_columns p, objects_m o WHERE o.owner = p.owner AND o.name = p.name AND o.object_type = p.object_type ORDER BY 1 ASC, 2 DESC, 3, 4, 5 / -- COL index_name FOR A30 HEA 'Index Name'; COL visibility FOR A10 HEA 'Visibility'; COL partitioned FOR A4 HEA 'Part'; COL column_position FOR 999 HEA 'Pos'; COL column_name FOR A30 HEA 'Column Name'; COL data_type FOR A33 HEA 'Data Type'; COL nullable FOR A8 HEA 'Nullable'; COL data_default FOR A30 HEA 'Data Default'; COL num_distinct FOR 999,999,999,990 HEA 'Num Distinct'; COL low_value_translated FOR A64 HEA 'Low Value Translated'; COL high_value_translated FOR A64 HEA 'High Value Translated'; COL density FOR 0.000000000 HEA 'Density'; COL num_nulls FOR 999,999,999,990 HEA 'Num Nulls'; COL num_buckets FOR 999,990 HEA 'Buckets'; COL histogram FOR A15 HEA 'Histogram'; COL sample_size FOR 999,999,999,990 HEA 'Sample Size'; COL last_analyzed FOR A19 HEA 'Last Analyzed'; COL avg_col_len FOR 999,999,990 HEA 'Avg Col Len'; COL data_length FOR 999,999,990 HEA 'Data Length'; COL char_length FOR 999,999,990 HEA 'Char Length'; -- BRE ON index_name SKIP 1 ON visibility ON partitioned; -- PRO PRO INDEX COLUMNS (dba_ind_columns) &&table_owner..&&table_name. PRO ~~~~~~~~~~~~~ WITH ic AS (SELECT /*+ MATERIALIZE NO_MERGE */ * FROM dba_ind_columns WHERE table_owner = '&&table_owner.' AND table_name = '&&table_name.' AND ROWNUM >= 1), tc AS (SELECT /*+ MATERIALIZE NO_MERGE */ * FROM dba_tab_cols WHERE owner = '&&table_owner.' AND table_name = '&&table_name.' AND ROWNUM >= 1), ix AS (SELECT /*+ MATERIALIZE NO_MERGE */ * FROM dba_indexes WHERE table_owner = '&&table_owner.' AND table_name = '&&table_name.' AND ROWNUM >= 1) SELECT i.index_name, x.visibility, x.partitioned, i.column_position, c.column_name, c.data_type, c.nullable, c.data_default 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,64) WHEN c.data_type IN ('NVARCHAR2','NCHAR') THEN SUBSTR(to_char(utl_raw.cast_to_nvarchar2(c.low_value)),1,64) 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'))||'T'|| 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'))||'T'|| 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,64) WHEN c.data_type IN ('NVARCHAR2','NCHAR') THEN SUBSTR(to_char(utl_raw.cast_to_nvarchar2(c.high_value)),1,64) 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'))||'T'|| 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'))||'T'|| 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, '&&cs_datetime_full_format.') last_analyzed, c.avg_col_len, c.data_length, c.char_length FROM ic i, tc c, ix x WHERE i.table_owner = '&&table_owner.' AND i.table_name = '&&table_name.' AND c.owner = i.table_owner AND c.table_name = i.table_name AND c.column_name = i.column_name AND x.table_owner = i.table_owner AND x.table_name = i.table_name AND x.index_name = i.index_name ORDER BY i.index_name, i.column_position / -- CL BRE; -- COL column_id FOR 999 HEA 'ID'; COL column_name FOR A30 HEA 'Column Name'; COL data_type FOR A33 HEA 'Data Type'; COL nullable FOR A8 HEA 'Nullable'; COL data_default FOR A30 HEA 'Data Default'; COL num_distinct FOR 999,999,999,990 HEA 'Num Distinct'; COL low_value_translated FOR A64 HEA 'Low Value Translated'; COL high_value_translated FOR A64 HEA 'High Value Translated'; COL density FOR 0.000000000 HEA 'Density'; COL num_nulls FOR 999,999,999,990 HEA 'Num Nulls'; COL num_buckets FOR 999,990 HEA 'Buckets'; COL histogram FOR A15 HEA 'Histogram'; COL sample_size FOR 999,999,999,990 HEA 'Sample Size'; COL last_analyzed FOR A19 HEA 'Last Analyzed'; COL avg_col_len FOR 999,999,990 HEA 'Avg Col Len'; COL data_length FOR 999,999,990 HEA 'Data Length'; COL char_length FOR 999,999,990 HEA 'Char Length'; -- BRE ON owner ON table_name SKIP 1; -- PRO PRO TABLE COLUMNS (dba_tab_cols) &&table_owner..&&table_name. PRO ~~~~~~~~~~~~~ SELECT c.column_id, c.column_name, c.data_type, c.nullable, c.data_default 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,64) WHEN c.data_type IN ('NVARCHAR2','NCHAR') THEN SUBSTR(to_char(utl_raw.cast_to_nvarchar2(c.low_value)),1,64) 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'))||'T'|| 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'))||'T'|| 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,64) WHEN c.data_type IN ('NVARCHAR2','NCHAR') THEN SUBSTR(to_char(utl_raw.cast_to_nvarchar2(c.high_value)),1,64) 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'))||'T'|| 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'))||'T'|| 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, '&&cs_datetime_full_format.') last_analyzed, c.avg_col_len, c.data_length, c.char_length FROM dba_tab_cols c WHERE c.owner = '&&table_owner.' AND c.table_name = '&&table_name.' ORDER BY c.column_id / -- CL BRE; -- COL column_name FOR A30 HEA 'Column Name'; COL index_name FOR A30 HEA 'Index Name'; COL segment_name FOR A30 HEA 'Segment Name'; COL bytes FOR 999,999,999,990 HEA 'Bytes'; COL blocks FOR 999,999,990 HEA 'Blocks'; COL size_MiB FOR 999,999,990.000 HEA 'Size MiB'; COL size_MB FOR 999,999,990.000 HEA 'Size MB'; COL deduplication FOR A13 HEA 'Deduplication'; COL compression FOR A11 HEA 'Compression'; COL encrypt FOR A7 HEA 'Encrypt'; COL cache FOR A5 HEA 'Cache'; COL securefile FOR A10 HEA 'SecureFile'; COL in_row FOR A6 HEA 'In Row'; COL tablespace_name FOR A30 HEA 'Tablespace'; -- BRE ON owner ON table_name SKIP 1; -- SET HEA OFF; PRO PRO COLUMN USAGE REPORT (dbms_stats.report_col_usage) &&table_owner..&&table_name. PRO ~~~~~~~~~~~~~~~~~~~ SELECT DBMS_STATS.report_col_usage('&&table_owner.', '&&table_name.') FROM DUAL / SET HEA ON; -- PRO PRO LOBS (dba_lobs) PRO ~~~~ SELECT l.column_name, l.index_name, l.segment_name, SUM(s.bytes) AS bytes, SUM(s.blocks) AS blocks, --SUM(s.blocks) * COALESCE(b.block_size, TO_NUMBER(p.value)) / POWER(2,20) AS size_MiB, SUM(s.blocks) * COALESCE(b.block_size, TO_NUMBER(p.value)) / POWER(10,6) AS size_MB, l.deduplication, l.compression, l.encrypt, l.cache, l.securefile, l.in_row, l.tablespace_name FROM dba_lobs l, dba_segments s, dba_tablespaces b, v$parameter p WHERE l.owner = '&&table_owner.' AND l.table_name = '&&table_name.' AND s.owner = l.owner AND s.segment_name = l.segment_name AND s.segment_type IN ('LOBSEGMENT', 'LOB PARTITION') AND b.tablespace_name(+) = l.tablespace_name AND p.name = 'db_block_size' GROUP BY l.column_name, l.index_name, l.segment_name, l.deduplication, l.compression, l.encrypt, l.cache, l.securefile, l.in_row, l.tablespace_name, b.block_size, p.value ORDER BY l.column_name / -- CL BRE; -- COL owner FOR A30 HEA 'Owner' TRUNC; COL table_name FOR A30 HEA 'Table Name' TRUNC; COL index_name FOR A30 HEA 'Index Name' TRUNC; COL metadata FOR A200 HEA 'Metadata'; -- PRO PRO TABLE METADATA (DBMS_METADATA.get_ddl) &&table_owner..&&table_name. PRO ~~~~~~~~~~~~~~ SELECT t.owner, t.table_name, DBMS_METADATA.get_ddl('TABLE', t.table_name, t.owner) AS metadata FROM dba_tables t WHERE t.owner = '&&table_owner.' AND t.table_name = '&&table_name.' ORDER BY t.owner, t.table_name / -- PRO PRO INDEX METADATA (DBMS_METADATA.get_ddl) &&table_owner..&&table_name. PRO ~~~~~~~~~~~~~~ SELECT i.owner, i.table_name, i.index_name, DBMS_METADATA.get_ddl('INDEX', i.index_name, i.owner) AS metadata FROM dba_tables t, dba_indexes i WHERE t.owner = '&&table_owner.' AND t.table_name = '&&table_name.' AND i.table_owner = t.owner AND i.table_name = t.table_name ORDER BY i.owner, i.table_name, i.index_name / -- COL num_rows FOR 999,999,999,990 HEA 'Num Rows'; COL kievlive FOR A8 HEA 'KievLive'; -- PRO PRO KIEV LIVE (dba_tab_histograms) &&table_owner..&&table_name. PRO ~~~~~~~~~ SELECT SUBSTR(UTL_RAW.CAST_TO_VARCHAR2(SUBSTR(LPAD(TO_CHAR(h.endpoint_value,'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'),30,'0'),1,12)), 1, 8) kievlive, h.endpoint_number - LAG(h.endpoint_number, 1, 0) OVER (ORDER BY h.endpoint_value) num_rows FROM dba_tab_histograms h WHERE h.owner = '&&table_owner.' AND h.table_name = '&&table_name.' AND h.column_name = 'KIEVLIVE' ORDER BY 1 / -- DEF cs_num_rows_limit_display = '1B'; DEF cs_num_rows_limit_number = '1e9'; @@cs_internal/cs_top_primary_keys_table.sql @@cs_internal/cs_top_secondary_keys_table.sql -- PRO PRO SQL> @&&cs_script_name..sql "&&table_owner." "&&table_name." -- @@cs_internal/cs_spool_tail.sql @@cs_internal/cs_undef.sql @@cs_internal/cs_reset.sql --