Oracle PRVT_COMPRESSION
Version 26ai

General Information
Library Note Morgan's Library Page Header
The best Oracle News for FY2026

Oracle Database 26ai will be available on generic Linux platforms in January and soon on AIX and Windows
Purpose This internal package supports advanced compression features introduced beginning with 11gR1
AUTHID CURRENT_USER
Constants
Name Data Type Value
COMP_RATIO_ALLROWS BINARY_INTEGER -1
COMP_TMP_OBJ_PREFIX VARCHAR2 'CMP4$'
Dependencies
ALL_CONSTRAINTS ALL_TAB_PARTITIONS DBMS_OUTPUT
ALL_EXTERNAL_TABLES ALL_TAB_SUBPARTITIONS DBMS_SPACE
ALL_INDEXES ALL_VARRAYS DBMS_STANDARD
ALL_IND_COLUMNS DBA_OBJECTS DUAL
ALL_IND_PARTITIONS DBA_SEGMENTS PLITBLM
ALL_IND_SUBPARTITIONS DBMS_ADVISOR PRVT_COMPRESS
ALL_LOBS DBMS_ASSERT USER_TABLESPACES
ALL_OBJECTS DBMS_COMPRESSION WRI$_ADV_COMPRESSION_T
ALL_PART_INDEXES DBMS_FEATURE_ADV_IDXCMP WRI$_ADV_FINDINGS
ALL_TABLES DBMS_FEATURE_ADV_TABCMP WRI$_ADV_MESSAGE_GROUPS
ALL_TAB_COLS DBMS_INTERNAL_LOGSTDBY WRI$_ADV_OBJECTS
ALL_TAB_COLUMNS DBMS_LOB WRI$_ADV_SEQ_MSGGROUP
Documented No
First Available 11.2
Security Model Owned by SYS with EXECUTE granted to PUBLIC
Source {ORACLE_HOME}/rdbms/admin/prvtcmpr.plb
Subprograms
 
ADV_ANALYZE_TABLE
Undocumented prvt_compression.adv_analyze_table(
tabowner       IN VARCHAR2,
tabname        IN VARCHAR2,
tabpart        IN VARCHAR2,
comptype       IN NUMBER,
scratchtbsname IN VARCHAR2);
set serveroutput on

exec prvt_compression_adv_analyze_table('UWCLASS', 'SERVERS', NULL, 1, 'UWDATA');
     *
PLS-00114: identifier 'PRVT_COMPRESSION_ADV_ANALYZE_T' too long
 
GET_ALLINDEX_COMPRESSION_RATIO
Undocumented prvt_compression.get_allindex_compression_ratio(
scratchtbsname IN  VARCHAR2,
ownname        IN  VARCHAR2,
tabname        IN  VARCHAR2,
comptype       IN  NUMBER,
index_cr       OUT dbms_compression.compreclist,
comptype_str   OUT VARCHAR2,
subset_numrows IN  NUMBER);
TBD
 
GET_COMPRESSION_RATIO
Undocumented prvt_compression.get_comression_ratio(
scratchtbsname IN  VARCHAR2,
tabowner       IN  VARCHAR2,
tabname        IN  VARCHAR2,
tabpart        IN  VARCHAR2,
comptype       IN  NUMBER,
blkcnt_cmp     OUT BINARY_INTEGER,
blkcnt_uncmp   OUT BINARY_INTEGER,
row_cmp        OUT BINARY_INTEGER,
row_uncmp      OUT BINARY_INTEGER,
cmp_ratio      OUT NUMBER,
comptype_str   OUT VARCHAR2);
TBD
 
GET_INDEX_COMPRESSION_RATIO
Undocumented prvt_compression.get_index_compression_ratio(
scratchtbsname IN  VARCHAR2,
indexowner     IN  VARCHAR2,
indexname      IN  VARCHAR2,
partname       IN  VARCHAR2,
comptype       IN  NUMBER,
blkcnt_cmp     OUT BINARY_INTEGER,
blkcnt_uncmp   OUT BINARY_INTEGER,
row_cmp        OUT BINARY_INTEGER,
row_uncmp      OUT BINARY_INTEGER,
cmp_ratio      OUT NUMBER,
comptype_str   OUT VARCHAR2,
subset_numrows IN  NUMBER);
TBD
 
GET_IOT_COMPRESSION_RATIO (new 23ai)
Undocumented prvt_compression.get_iot_compression_ratio(
scratchtbsname VARCHAR2,
iotowner       VARCHAR2,
iotname        VARCHAR2,
partname       VARCHAR2,
comptype       NUMBER,
iot_cr         OUT sys.dbms_compression.compreclist,
comptype_str   OUT VARCHAR2,
subset_numrows IN  NUMBER);
TBD
 
GET_LOB_COMPRESSION_RATIO
Undocumented prvt_compression.get_lob_compression_ratio(
scratchtbsname IN  VARCHAR2,
tabowner       IN  VARCHAR2,
tabname        IN  VARCHAR2,
lobname        IN  VARCHAR2,
partname       IN  VARCHAR2,
comptype       IN  NUMBER,
blkcnt_cmp     OUT BINARY_INTEGER,
blkcnt_uncmp   OUT BINARY_INTEGER,
lobcnt         OUT BINARY_INTEGER,
cmp_ratio      OUT NUMBER,
comptype_str   OUT VARCHAR2,
subset_numrows IN  NUMBER);
SELECT dtc.table_name, dt.num_rows
FROM dba_tab_cols dtc, dba_tables dt, dba_lobs dl
WHERE dtc.data_type LIKE '%LOB%'
AND dtc.owner = 'SYS'
AND dtc.owner = dt.owner
AND dtc.owner = dl.owner
AND dtc.table_name = dt.table_name
AND dtc.table_name = dl.table_name
AND dtc.column_name = dl.column_name
AND dl.securefile = 'NO'
AND dt.num_rows > 0
AND dtc.num_nulls < dt.num_rows
ORDER BY 2;

desc wri$_optstat_histhead_history

DECLARE
 v1 BINARY_INTEGER;
 v2 BINARY_INTEGER;
 v3 BINARY_INTEGER;
 v4 NUMBER;
 v5 VARCHAR2(60);
BEGIN
  FOR i IN 1.. 2 LOOP
    prvt_compression.get_lob_compression_ratio(
      'SYSTEM',
      'SYS',
      'WRH$_SQL_PLAN',
      'OTHER_XML',
      NULL,
      i,
      v1, v2, v3, v4, v5,
      1000);

    dbms_output.put_line('Comptype = ' || TO_CHAR(i));
    dbms_output.put_line(TO_CHAR(v1));
    dbms_output.put_line(TO_CHAR(v2));
    dbms_output.put_line(TO_CHAR(v3));
    dbms_output.put_line(TO_CHAR(v4));
    dbms_output.put_line(v5);
  END LOOP;
END;
/
*
ORA-20000: Compression Advisor scratch tablespace must be space management auto


SELECT tablespace_name, segment_space_management
FROM dba_tablespaces
ORDER BY 2,1;

DECLARE
 v1 BINARY_INTEGER;
 v2 BINARY_INTEGER;
 v3 BINARY_INTEGER;
 v4 NUMBER;
 v5 VARCHAR2(60);
BEGIN
  FOR i IN 1.. 2 LOOP
    prvt_compression.get_lob_compression_ratio(
      'SYSAUX',
      'SYS',
      'WRH$_SQL_PLAN',
      'OTHER_XML',
      NULL,
      i,
      v1, v2, v3, v4, v5,
      1000);

    dbms_output.put_line('Comptype = ' || TO_CHAR(i));
    dbms_output.put_line(TO_CHAR(v1));
    dbms_output.put_line(TO_CHAR(v2));
    dbms_output.put_line(TO_CHAR(v3));
    dbms_output.put_line(TO_CHAR(v4));
    dbms_output.put_line(v5);
  END LOOP;
END;
/
Sampling percent: 92.42
*
ORA-20000: Compression option is not supported for securefile lobs


DECLARE
 v1 BINARY_INTEGER;
 v2 BINARY_INTEGER;
 v3 BINARY_INTEGER;
 v4 NUMBER;
 v5 VARCHAR2(60);
BEGIN
  FOR i IN 1.. 2 LOOP
    prvt_compression.get_lob_compression_ratio(
      'SYSAUX',
      'SYS',
      'TABPART$',
      'BHIBOUNDVAL',
      NULL,
      i,
      v1, v2, v3, v4, v5,
      100); -- note that this table contains only 363 rows so I've dropped the sample size

    dbms_output.put_line('Comptype = ' || TO_CHAR(i));
    dbms_output.put_line(TO_CHAR(v1));
    dbms_output.put_line(TO_CHAR(v2));
    dbms_output.put_line(TO_CHAR(v3));
    dbms_output.put_line(TO_CHAR(v4));
    dbms_output.put_line(v5);
  END LOOP;
END;
/
*
ORA-20000: Compression Advisor sample size must be at least 1000. Use COMP_RATIO_ALLROWS if the table has fewer rows.


/* from this demo you can safely surmise that you must choose a tablespace with space management auto, a table that does not use securefile to store the LOB and a table with 1000 rows or greater. */

I now have feedback from Oracle support and have tried using the COMP_RATIO_ALLROWS constant ... and there is yet another bug.



DECLARE
 v1 BINARY_INTEGER;
 v2 BINARY_INTEGER;
 v3 BINARY_INTEGER;
 v4 NUMBER;
 v5 VARCHAR2(60);
BEGIN
  FOR i IN 1.. 2 LOOP
    prvt_compression.get_lob_compression_ratio(
      'SYSAUX',
      'SYS',
      'TABPART$',
      'BHIBOUNDVAL',
       NULL,
       i,
       v1, v2, v3, v4, v5,
    prvt_compression.comp_ratio_allrows);

    dbms_output.put_line('Comptype = ' || TO_CHAR(i));
    dbms_output.put_line(TO_CHAR(v1));
    dbms_output.put_line(TO_CHAR(v2));
    dbms_output.put_line(TO_CHAR(v3));
    dbms_output.put_line(TO_CHAR(v4));
    dbms_output.put_line(v5);
  END LOOP;
END;
/
Sampling percent: 100
*
ORA-20000: Compression option is not supported for securefile lobs


-- the error message is incorrect as can be seen here:

SELECT securefile
FROM dba_lobs
WHERE table_name = 'TABPART$'
AND column_name = 'BHIBOUNDVAL';

SEC
---
NO
 
GET_LOB_NEW_COMPR_RATIO (new 23ai)
Undocumented prvt_compression.get_lob_new_compr_ration(
scratchtbsname  IN  VARCHAR2,
tabowner        IN  VARCHAR2,
tabname         IN  VARCHAR2,
lobname         IN  VARCHAR2,
partname        IN  VARCHAR2,
comptype        IN  NUMBER,
byte_comp_ratio OUT NUMBER,
subset_numrows  IN  NUMBER,
cmp_ratio       OUT NUMBER,
total_time      OUT NUMBER,
blkcnt_uncmp    OUT BINARY_INTEGER,
blkcnt_cmp      OUT BINARY_INTEGER,
lobcnt          OUT BINARY_INTEGER);
TBD
 
GET_NUM_PARTITIONS
Returns the number of partitions in a table: 1 for a non-partitioned table prvt_compression.get_num_partitions(
tabowner       IN  VARCHAR2,
tabname        IN  VARCHAR2)
RETURN NUMBER;
SELECT prvt_compression.get_num_partitions('UWCLASS', 'SERVERS');
 
GET_TABLE_COMPRESSION_RATIO
Undocumented prvt_compression.get_table_compression_ratio(
scratchtbsname IN  VARCHAR2,
tabowner       IN  VARCHAR2,
tabname        IN  VARCHAR2,
partname       IN  VARCHAR2,
comptype       IN  NUMBER,
blkcnt_cmp     OUT BINARY_INTEGER,
blkcnt_uncmp   OUT BINARY_INTEGER,
row_cmp        OUT BINARY_INTEGER,
row_uncmp      OUT BINARY_INTEGER,
cmp_ratio      OUT NUMBER,
comptype_str   OUT VARCHAR2,
subset_numrows IN  NUMBER);
CREATE TABLE c##abc.comptest
COMPRESS FOR ALL OPERATIONS AS
SELECT * FROM obj$;

DECLARE
 v1 BINARY_INTEGER;
 v2 BINARY_INTEGER;
 v3 BINARY_INTEGER;
 v4 BINARY_INTEGER;
 v5 NUMBER;
 v6 VARCHAR2(60);
BEGIN
  FOR i IN 1.. 2 LOOP
    prvt_compression.get_table_compression_ratio(
      'SYSTEM',
      'C##ABC',
      'COMPTEST',
      NULL,
      i,
      v1, v2, v3, v4, v5, v6,
      1000);

    dbms_output.put_line('Comptype = ' || TO_CHAR(i));
    dbms_output.put_line(TO_CHAR(v1));
    dbms_output.put_line(TO_CHAR(v2));
    dbms_output.put_line(TO_CHAR(v3));
    dbms_output.put_line(TO_CHAR(v4));
    dbms_output.put_line(TO_CHAR(v5));
    dbms_output.put_line(v6);
  END LOOP;
END;
/
 
INIT_TASK_STATE
Undocumented prvt_compression.init_task_state(task_id IN NUMBER, fin_id IN NUMBER);
TBD
 
OLTP_COMPRESSIBLE
Returns TRUE if a table is compressible, otherwise FALSE prvt_compression.oltp_compressible(
p_owner IN VARCHAR2,
p_table_name IN VARCHAR2)
RETURN BOOLEAN;
set serveroutput on

BEGIN
  IF prvt_compression.oltp_compressible('UWCLASS', 'SERVERS') THEN
    dbms_output.put_line('TRUE');
  ELSE
    dbms_output.put_line('FALSE');
  END IF;
END;
/
 
REPORT
Undocumented prvt_compression.report(
taskid IN NUMBER,
type   IN VARCHAR2,
level  IN VARCHAR2)
RETURN CLOB;
TBD

Related Topics
Advanced Compression
Built-in Functions
Built-in Packages
Hybrid Columnar Compression
PRVT_COMPRESS
Secure Files
What's New In 21c
What's New In 26ai

Morgan's Library Page Footer
This site is maintained by Daniel Morgan. Last Updated: This site is protected by copyright and trademark laws under U.S. and International law. © 1998-2026 Daniel A. Morgan All Rights Reserved