Oracle Database - Statistics - Table

Card Puncher Data Processing

About

  • Number of rows
  • Number of blocks
  • Average row length
  • Last Analyzed

Privileges

grant execute on DBMS_STATS to hr;

How to

Gather

See the GATHER_TABLE_STATS Procedure for a full description of the parameters

  • In the data dictionary
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS( NULL, tabname=>'DEPARTMENTS',
  estimate_percent=>100 );
END;
/
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS( NULL, tabname=>'DEPARTMENTS',
  estimate_percent=>100, stattab=>'STATTAB', statid=>'myFirstStats' );
END;
/

Get

  • numrows: Number of rows in the table (partition)
  • numblks: Number of blocks the table (partition) occupies
  • avgrlen: Average row length for the table (partition)
  • cachedblk: The average number of blocks in the buffer cache for the segment (index/table/index partition/table partition)
  • cachehit: The average cache hit ratio for the segment (index/table/index partition/table partition)

GET_TABLE_STATS

With the GET_TABLE_STATS procedure:

DECLARE
   numrows NUMBER; 
   numblks NUMBER;
   avgrlen NUMBER;
   cachedblk   NUMBER;
   cachehit    NUMBER;
   no_statistics	exception;
   PRAGMA EXCEPTION_INIT(no_statistics, -20000);
BEGIN
	
   DBMS_STATS.GET_TABLE_STATS (
   ownname=>null,
   tabname=>'DEPARTMENTS', 
   numrows=>numrows, 
   numblks=>numblks,
   avgrlen=>avgrlen,
   cachedblk=>cachedblk,
   cachehit=>cachehit);
   
   DBMS_OUTPUT.PUT_LINE( '');
   DBMS_OUTPUT.PUT_LINE( 'Statistics with the DBMS_STATS.GET_TABLE_STATS:');
   DBMS_OUTPUT.PUT_LINE( '-----------------------------------------------');
   DBMS_OUTPUT.PUT_LINE( 'numrows:    ' || numrows );
   DBMS_OUTPUT.PUT_LINE( 'numblks:    ' || numblks );
   DBMS_OUTPUT.PUT_LINE( 'avgrlen:    ' || avgrlen );
   DBMS_OUTPUT.PUT_LINE( 'cachedblk:  ' || cachedblk );
   DBMS_OUTPUT.PUT_LINE( 'cachehit:   ' || cachehit );
   
   EXCEPTION
		WHEN no_statistics THEN
			DBMS_OUTPUT.PUT_LINE( 'No Statistics for this table. No Statistics have been gathered ?');
			DBMS_OUTPUT.PUT_LINE( 'ORA-20000: Unable to get values for table DEPARTMENTS');
END;
/

USER_TABLES

SELECT
  NUM_ROWS,
  BLOCKS,
  AVG_ROW_LEN,
  SAMPLE_SIZE,
  LAST_ANALYZED
FROM
  user_tables
WHERE
  table_name LIKE 'DEPARTMENTS';

_tab_statistics

select * from  all_tab_statistics

Set

SET_TABLE_STATS Procedure

Delete

DELETE_TABLE_STATS Procedure

BEGIN
  DBMS_STATS.DELETE_TABLE_STATS(null,'DEPARTMENTS');
END;
/

Preference / Configuration

Create a Oracle Database - Statistics - stattab (Statistics Table)

BEGIN
   DBMS_STATS.CREATE_STAT_TABLE(NULL,'tables_prefs');  
   DBMS_STATS.EXPORT_TABLE_PREFS('SH', 'SALES',stattab => 'STAT');
END;
/

Compare

You compare the table statistics with the following diff_table_stats table function: (ie you get also the column statistics)

Function Description
DIFF_TABLE_STATS_IN_HISTORY Compares statistics for a table from two timestamps in past and compare the statistics as of that timestamps
DIFF_TABLE_STATS_IN_PENDING Compares pending statistics and statistics as of a timestamp or statistics from dictionary
DIFF_TABLE_STATS_IN_STATTAB Compares statistics for a table from two different sources (STATTAB)

Example:

SELECT
  *
FROM
  TABLE( DBMS_STATS.DIFF_TABLE_STATS_IN_STATTAB( NULL, 'DEPARTMENTS', stattab1
  =>'STATTAB', stattab2=>'STATTAB', statid1=>'myFirstStats', statid2=>
  'myFirstStats2' ) );
REPORT                                                                           MAXDIFFPCT
-------------------------------------------------------------------------------- ----------
###############################################################################  null

STATISTICS DIFFERENCE REPORT FOR:
.................................

TABLE         : DEPARTMENTS
OWNER         : HR
SOURCE A      : User statistics table STATTAB
              : Statid     : MYFIRSTSTATS
              : Owner      : HR
SOURCE B      : User statistics table STATTAB
              : Statid     : MYFIRSTSTATS2
              : Owner      : HR
PCTTHRESHOLD  : 10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

TABLE / (SUB)PARTITION STATISTICS DIFFERENCE:
.............................................

OBJECTNAME                  TYP SRC ROWS       BLOCKS     ROWLEN     SAMPSIZE
...............................................................................

DEPARTMENTS                 T   A   NO_STATS
                                B   27         5          21         27
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

COLUMN STATISTICS DIFFERENCE:
.............................

COLUMN_NAME     SRC NDV     DENSITY    HIST NULLS   LEN  MIN   MAX   SAMPSIZ
...............................................................................

DEPARTMENT_ID   A   NO_STATS
                B   27      .037037037 NO   0       4    C10B  C2034 27
DEPARTMENT_NAME A   NO_STATS
                B   27      .037037037 NO   0       12   41636 54726 27
LOCATION_ID     A   NO_STATS
                B   7       .018518518 YES  0       3    C20F  C21C  27
MANAGER_ID      A   NO_STATS
                B   11      .090909090 NO   16      3    C202  C2030 11
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

INDEX / (SUB)PARTITION STATISTICS DIFFERENCE:
.............................................

OBJECTNAME      TYP SRC ROWS    LEAFBLK DISTKEY LF/KY DB/KY CLF     LVL SAMPSIZ
...............................................................................


                                INDEX: DEPT_ID_PK
                                .................

DEPT_ID_PK      I   A   NO_STATS
                    B   27      1       27      1     1     1       0   27

                             INDEX: DEPT_LOCATION_IX
                             .......................

DEPT_LOCATION_I I   A   NO_STATS
                    B   27      1       7       1     1     1       0   27
###############################################################################

Lock

execute DBMS_STATS.LOCK_TABLE_STATS('SCHEMA','TABLE_TEST');
execute DBMS_STATS.UNLOCK_TABLE_STATS('SCHEMA','TABLE_TEST');
  • The stattype_locked column gives the lock status
select owner, table_name, stattype_locked from dba_tab_statistics where table_name = 'TABLE_TEST';

Reference





Discover More
Card Puncher Data Processing
Glossary

(CREATE, ALTER, DROP) (GRANT, REVOKE) (SELECT, UPDATE, INSERT, DELETE) (COMMIT, ROLLBACK) NLS (National Language Support) UDML is the abbreviation for Universal Database Markup Language ...
Card Puncher Data Processing
Oracle Database

Documentation about the Oracle database
Card Puncher Data Processing
Oracle Database - Optimizer Statistics

Optimizer statistic in Oracle You can collect exact or estimated statistics physical storage characteristics and data distribution in these schema objects by using the DBMS_STATS...
Card Puncher Data Processing
Oracle Database - Selectivity

The first measure of the plan_estimator, selectivity, represents a fraction of rows from a row set. The row set can be a base table, a view, or the result of a join or a GROUP BY operator. The selectivity...
Card Puncher Data Processing
Oracle Database - Statistics - Columns

For columns with skewed data, you should collect histograms. Statistics Col Description NUM_DISTINCT Number of distinct values (NDV) LOW_VALUE Low value HIGH_VALUE High value NUM_NULLS Number...



Share this page:
Follow us:
Task Runner