4 CTX_ANL
AUTO_LEXERと一緒に使用されるCTX_ANL
パッケージには、レクサーにカスタム・ディクショナリを追加したり、レクサーからカスタム・ディクショナリを削除するためのプロシージャが用意されています。
カスタム・ディクショナリは、学問や業界の専門分野に特化して作成されたものであることがあります。 ほとんどの場合、Oracle Textのサポート対象言語で用意されているディクショナリを使用しても、ユーザーの要件を十分に満たすことができます。
Oracle Textのコンテキストでのこのパッケージの詳細は、『Oracle Textリファレンス』のCTX_ANL
に関する項を参照してください。
4.1 GET_COMPRESSION_RATIOプロシージャ
このプロシージャを使用して、既存のSecureFile LOBに圧縮機能を有効にすることで保存できるようになる記憶域を見積もります。 表または索引の圧縮比を分析して、オブジェクトの圧縮率に関する情報を提供します。 各種のパラメータを指定して、個別の圧縮タイプを選択的に分析できます。
Oracle Database 23aiでは、このプロシージャは、少ない領域の使用でLOBの圧縮率をより速く推定するように機能強化されています。 BasicFile LOBの圧縮率の推定も可能になりました。 これにより、BasicFile LOBのSecureFile LOBへの移行前に、BasicFile LOBを圧縮するかどうかを事前に決定できます。 さらに、LOBバイト・レベルでの圧縮比の推定や、表内のLOBデータの圧縮にかかる時間の推定もできます(時間単位)。
圧縮率は、指定したLOB列の行数について見積もられます。 たとえば、圧縮率が2.33であるとします。 これは、圧縮機能を有効にすると、LOB列のサンプリングされた行について領域の約半分を節約できることを示します。
免責事項: 圧縮率は、LOB列のサンプリングされた行に基づいて計算される概算値です。 表全体に対して圧縮を有効にしたときに節約できる実際の領域とは異なる場合があります。
構文
圧縮率を取得するための構文は、オブジェクト、LOB、IOTおよび表の索引に応じて異なります。
-
オブジェクト(表または索引。デフォルトは表)の圧縮率を取得する構文。
DBMS_COMPRESSION.GET_COMPRESSION_RATIO ( scratchtbsname IN VARCHAR2, ownname IN VARCHAR2, objname IN VARCHAR2, subobjname IN VARCHAR2, comptype IN NUMBER, blkcnt_cmp OUT PLS_INTEGER, blkcnt_uncmp OUT PLS_INTEGER, row_cmp OUT PLS_INTEGER, row_uncmp OUT PLS_INTEGER, cmp_ratio OUT NUMBER, comptype_str OUT VARCHAR2, block_compr_ratio OUT PLS_INTEGER, byte_comp_ratio OUT NUMBER, subset_numrows IN NUMBER DEFAULT COMP_RATIO_MINROWS, objtype IN PLS_INTEGER DEFAULT OBJTYPE_TABLE);
-
BasicFile LOBとSecureFile LOBの圧縮率を取得する構文:
DBMS_COMPRESSION.GET_COMPRESSION_RATIO ( scratchtbsname IN VARCHAR2, tabowner IN VARCHAR2, tabname IN VARCHAR2, lobname IN VARCHAR2, partname IN VARCHAR2, comptype IN NUMBER, blkcnt_cmp OUT PLS_INTEGER, blkcnt_uncmp OUT PLS_INTEGER, lobcnt OUT PLS_INTEGER, cmp_ratio OUT NUMBER, comptype_str OUT VARCHAR2, byte_comp_ratio OUT NUMBER, total_time OUT NUMBER subset_numrows IN NUMBER DEFAULT COMP_RATIO_LOB_MAXROWS);
-
表のすべての索引の圧縮率を取得する構文。 圧縮率はコレクションとして戻されます。
DBMS_COMPRESSION.GET_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 DEFAULT COMP_RATIO_INDEX_MINROWS);
-
IOTの圧縮率を取得する構文。
DBMS_COMPRESSION.GET_COMPRESSION_RATIO ( scratchtbsname IN VARCHAR2, ownname IN VARCHAR2, objname IN VARCHAR2, subobjname IN VARCHAR2, comptype IN NUMBER, iotcomp_cr OUT DBMS_COMPRESSION.COMPRECLIST, comptype_str OUT VARCHAR2, subset_numrows IN NUMBER DEFAULT COMP_RATIO_INDEX_MINROWS);
パラメータ
表4-1 GET_COMPRESSION_RATIOプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
分析に使用できる一時スクラッチ表領域。 |
|
分析する表のスキーマ。 |
|
分析する表の名前。 |
|
オブジェクト名 |
|
オブジェクトのパーティションまたはサブパーティションの名前。 |
|
分析を実行する対象の圧縮タイプ。 オブジェクトが索引の場合、有効な圧縮タイプは、 ノート: |
|
表の圧縮されたサンプルに使用されるブロック数。 |
|
表の圧縮解除されたサンプルに使用されるブロック数。 |
|
表の圧縮されたサンプルにあるブロック内の行数。 |
|
表の圧縮解除されたサンプルにあるブロック内の行数。 |
|
圧縮比、 |
|
圧縮タイプを説明する文字列。 |
|
圧縮比を見積もるためにサンプリングされた行数。 |
|
|
|
LOB列名 |
|
パーティション化された表の場合は、関連したパーティション名。 |
|
圧縮比を見積もるために実際にサンプリングされたLOBの数。 |
byte_comp_ratio |
LOBの圧縮データのバイト数に対する非圧縮データのバイト数の比率を提示します。 |
|
索引のリストおよび見積り済の圧縮率。 |
iotcomp_cr |
IOTの圧縮率 最初のオブジェクトには、IOT全体の圧縮率が含まれます。 2番目のオブジェクトには、IOTの最上位索引セクション(オーバーフロー・セグメントを除く)の圧縮率のみが含まれます。 |
total_time |
表内のLOBデータを圧縮するためにかかる推定時間を提示します(時間単位)。 |
例: 表内および表外LOBの圧縮率の見積り
次の例は、LOBの圧縮率を見積もる方法を示しています。
SET SERVEROUTPUT ON
DECLARE
bcmp INTEGER;
buncmp INTEGER;
lobcmp INTEGER;
cr NUMBER;
byte_cr NUMBER;
cstr VARCHAR2(2000);
total_time NUMBER;
l_segment_name VARCHAR2(30);
l_segment_size_blocks NUMBER;
l_segment_size_bytes NUMBER;
l_used_blocks NUMBER;
l_used_bytes NUMBER;
l_expired_blocks NUMBER;
l_expired_bytes NUMBER;
l_unexpired_blocks NUMBER;
l_unexpired_bytes NUMBER;
BEGIN
DBMS_COMPRESSION.GET_COMPRESSION_RATIO (
scratchtbsname => 'LOBTBSP',
tabowner => 'CMPADV',
tabname => p_tablename,
lobname => 'C',
partname => NULL,
comptype => 256,
blkcnt_cmp => bcmp,
blkcnt_uncmp => buncmp,
lobcnt => lobcmp,
cmp_ratio => cr,
comptype_str => cstr,
subset_numrows => 1000,
byte_comp_ratio => byte_cr,
total_time => total_time
);
DBMS_OUTPUT.put_line('Estimated ratio of blocks used by the uncompressed data to the compressed data : ' || cr);
DBMS_OUTPUT.put_line('Estimated ratio of bytes used by the uncompressed data to the compressed data : ' || byte_cr);
END;
/
このプロシージャの出力を理解するために、次の例に示すように、表内のtab_inline
と、表外のtab_outofline
について考えてみます。CREATE TABLE tab_inline
(
a NUMBER,
c CLOB
)
LOB(c) STORE AS SECUREFILE (ENABLE STORAGE IN ROW CACHE LOGGING);
CREATE TABLE tab_outofline
(
a NUMBER,
c CLOB
)
LOB(c) STORE AS SECUREFILE (DISABLE STORAGE IN ROW CACHE LOGGING);
データは、tab_inline
とtab_outofline
では異なる方法で格納されます。 tab_inline
表では、LOBが4K未満の場合にデータが表セグメントに格納され、それ以外の場合にLOBセグメントに格納されます。 tab_outofline
表の場合は、すべてのサイズのデータがLOBセグメントに格納されます。
両方の表にそれぞれが3Kの1000個のLOBを挿入して、圧縮率を計算するとします。 dbms_space.space_usage
プロシージャを使用すると、LOBセグメントに格納されているデータによって使用された領域を計算できます。
表内LOBの圧縮率のサンプル出力。
Estimated block compression ratio : 1
Estimated byte compression ratio : 57.6
Space used(in bytes) : 0
space used(in blocks) : 0
表外LOBの圧縮率のサンプル出力。
Estimated block compression ratio : 1
Estimated byte compression ratio : 56.1
Space used(in bytes) : 8 MB
space used(in blocks) : 1000
この例では、表内LOBと表外LOBの推定バイト圧縮率とブロック圧縮率はほぼ同じですが、使用されている領域は異なります。 tab_inline
の場合、LOBセグメントは使用されていないため、使用済領域は0です。 どちらの場合も、データは約3KBと小さなサイズです。 そのため、圧縮の前後のデータは同じ数のブロック(1ブロック)を使用していて、ブロック圧縮率は1になります。 ただし、圧縮の前後でLOBが使用した実際のバイト数を比較するバイト・レベルの圧縮率byte_comp_ratio
は、57.6または56.1になっています。
例: 低圧縮タイプによる表の索引の圧縮率の見積り
次の例は、拡張索引圧縮(低)の圧縮率を見積もる方法を示しています:
SET SERVEROUTPUT ON
DECLARE
1_blkcnt_cmp PLS_INTEGER;
1_blkcnt_uncmp PLS_INTEGER
1_row_cmp PLS_INTEGER;
1_row_uncmp PLS_INTEGER;
1_cmp_ratio NUMBER;
1_comptype_str VARCHAR2(32767);
BEGIN
DBMS_COMPRESSION.GET_COMPRESSION_RATIO (
scratchtbsname => 'USERS' ,
ownname => 'TEST' ,
objname => 'SALES_IDX' ,
subobjname => NULL ,
comptype => DBMS_COMPRESSION.COMP_INDEX_ADVANCED_LOW,
blkcnt_cmp => 1_blkcnt_cmp,
blkcnt_uncmp => 1_blkcnt_uncmp,
row_cmp => 1_row_cmp,
row_uncmp => 1_row_uncmp,
cmp_ratio => 1_cmp_ratio,
comptype_str => 1_comptype_str,
subset_numrows => DBMS_COMPRESSION.comp_ratio_minrows,
objtype => DBMS_COMPRESSION.objtype_index
);
DBMS_OUTPUT.put_line( 'Number of blocks used by the compressed sample of the object : ' || 1_blkcnt_cmp);
DBMS_OUTPUT.put_line( 'Number of blocks used by the uncompressed sample of the object : ' || 1_blkcnt_uncmp);
DBMS_OUTPUT.put_line( 'Number of rows in a block in compressed sample of the object : ' || 1_row_cmp);
DBMS_OUTPUT.put_line( 'Number of rows in a block in uncompressed sample of the object : ' || 1_row_uncmp);
DBMS_OUTPUT.put_line( 'Estimated Compression Ratio of Sample : ' || 1_cmp_ratio);
DBMS_OUTPUT.put_line( 'Compression Type : ' || 1_comptype_str);
END;
/
拡張索引圧縮(低)の圧縮アドバイザ見積りの出力:
Number of blocks used by the compressed sample of the object : 243 Number of blocks used by the uncompressed sample of the object : 539 Number of rows in a block in compressed sample of the object : 499 Number of rows in a block in uncompressed sample of the object : 145 Estimated Compression Ratio of Sample : 2.2 Compression Type : âCompress Advanced Lowâ
例: 中圧縮タイプによるLOBの圧縮率の見積り
次の例は、拡張LOB圧縮(中)の圧縮率を見積もる方法を示しています:
SET SERVEROUTPUT ON
DECLARE
1_blkcnt_cmp PLS_INTEGER;
1_blkcnt_uncmp PLS_INTEGER;
1_row_cmp PLS_INTEGER;
1_lobcnt PLS_INTEGER;
1_cmp_ratio NUMBER;
1_comptype_str VARCHAR2(32767);
BEGIN
DBMS_COMPRESSION.GET_COMPRESSION_RATIO (
scratchtbsname => 'USERS' ,
tabowner => 'TEST' ,
tabname => 'PARTS' ,
lobname => 'PART_DESCRIPTION' ,
partname => NULL ,
comptype => DBMS_COMPRESSION.COMP_LOB_MEDIUM,
blkcnt_cmp => 1_blkcnt_cmp,
blkcnt_uncmp => 1_blkcnt_uncmp,
row_cmp => 1_row_cmp,
lobcnt => 1_lobcnt,
cmp_ratio => 1_cmp_ratio,
comptype_str => 1_comptype_str,
subset_numrows => DBMS_COMPRESSION.comp_ratio_lob_maxrows
);
DBMS_OUTPUT.put_line( 'Number of blocks used by the compressed sample of the object : ' || 1_blkcnt_cmp);
DBMS_OUTPUT.put_line( 'Number of blocks used by the uncompressed sample of the object : ' || 1_blkcnt_uncmp);
DBMS_OUTPUT.put_line( 'Number of rows in a block in compressed sample of the object : ' || 1_row_cmp);
DBMS_OUTPUT.put_line( 'Number of LOBS actually sampled : ' || 1_lobcnt);
DBMS_OUTPUT.put_line( 'Estimated Compression Ratio of Sample : ' || 1_cmp_ratio);
DBMS_OUTPUT.put_line( 'Compression Type : ' || 1_comptype_str);
END;
/
拡張LOB圧縮(中)の圧縮アドバイザ見積りの出力:
Number of blocks used by the compressed sample of the object : 199 Number of blocks used by the uncompressed sample of the object : 389 Number of rows in a block in compressed sample of the object : 293 Number of LOBS actually sampled : 55 Estimated Compression Ratio of Sample : 1.9 Compression Type : âCompress Mediumâ
例: IoTの圧縮率の見積り
次の例は、IOTの圧縮率を見積もる方法を示しています。
SET SERVEROUTPUT ON
DECLARE
bcmp INTEGER;
buncmp INTEGER;
rowcmp INTEGER;
rowuncmp INTEGER;
cr NUMBER;
cstr VARCHAR2(2000);
iotcomp_cr DBMS_COMPRESSION.COMPRECLIST;
BEGIN
DBMS_COMPRESSION.GET_COMPRESSION_RATIO (
scratchtbsname => 'USERS',
ownname => 'TEST',
objname => 'SALES',
subobjname => NULL,
comptype => DBMS_COMPRESSION.COMP_INDEX_ADVANCED_LOW,
iotcomp_cr => iotcomp_cr,
comptype_str => cstr,
subset_numrows => DBMS_COMPRESSION.COMP_RATIO_ALLROWS
);
--information about the index and the overflow segment
DBMS_OUTPUT.put_line( 'Number of blocks used by the compressed sample of the IOT table : ' || iotcomp_cr(1).blkcnt_cmp);
DBMS_OUTPUT.put_line( 'Number of blocks used by the uncompressed sample of the IOT table : ' || iotcomp_cr(1).blkcnt_uncmp);
DBMS_OUTPUT.put_line( 'Average number of rows in a block in the compressed sample of the IOT table : ' || iotcomp_cr(1).row_cmp);
DBMS_OUTPUT.put_line( 'Average number of rows in a block in the uncompressed sample of the IOT table : ' || iotcomp_cr(1).row_uncmp);
DBMS_OUTPUT.put_line( 'Estimated Compression Ratio of the sample : ' || iotcomp_cr(1).cmp_ratio);
--information about the index segment
DBMS_OUTPUT.put_line( 'Number of blocks used by the compressed sample of the index segment of the IOT table : ' || iotcomp_cr(2).blkcnt_cmp);
DBMS_OUTPUT.put_line( 'Number of blocks used by the uncompressed sample of the index segment of the IOT table : ' || iotcomp_cr(2).blkcnt_uncmp);
DBMS_OUTPUT.put_line( 'Average number of rows in a block in the compressed sample of the index segment of the IOT table : ' || iotcomp_cr(2).row_cmp);
DBMS_OUTPUT.put_line( 'Average number of rows in a block in the uncompressed sample of the index segment of the IOT table : ' || iotcomp_cr(2).row_uncmp);
DBMS_OUTPUT.put_line( 'Estimated Compression Ratio of the sample : ' || iotcomp_cr(2).cmp_ratio);
END;
/
IOTの圧縮率の出力:
Number of blocks used by the compressed sample of the IOT table : 5027 Number of blocks used by the uncompressed sample of the IOT table : 7950 Average number of rows in a block in the compressed sample of the IOT table : 199 Average number of rows in a block in the uncompressed sample of the IOT table : 126 Estimated Compression Ratio of the sample : 1.58 Number of blocks used by the compressed sample of the index segment of the IOT table : 3238 Number of blocks used by the uncompressed sample of the index segment of the IOT table : 6161 Average number of rows in a block in the compressed sample of the index segment of the IOT table : 309 Average number of rows in a block in the uncompressed sample of the index segment of the IOT table : 162 Estimated Compression Ratio of the sample : 1.9
使用上のノート
- プロシージャは、スクラッチ表領域に異なる表を作成し、これらのオブジェクトで分析を実行します。 ユーザー指定の表では何も変更しません。
-
23ai以降、この機能は、少ない領域の使用でLOBの圧縮率をより速く推定するように機能強化されています。 より正確な結果を得るには、次のコマンドを実行して古いメソッドに切り替えます。 圧縮率を計算する古いメソッドでは、結果を返すまでに時間がかかり、より多くの領域が使用されます。
alter session set "_kdlf_new_compression_adv"= FALSE;
- 圧縮の効果を理解するために、表内LOBについてはバイト圧縮率の値を使用し、表外LOBについてはブロック圧縮率と使用済領域の値を使用します。
- 少量のデータよりも大量のデータを圧縮するときに多くのメリットが得られます。 小量のデータを圧縮する場合は、ブロック率ではなくバイト率を調べて圧縮の効果を把握してください。