SecureFile Общие сведения о типе сжатия - PullRequest
1 голос
/ 05 мая 2020
• 1000 итоговый размер сжатого файла, кроме. Есть ли другие критерии для использования? Например, размер исходного файла

1 Ответ

1 голос
/ 05 мая 2020

Это очень, очень хороший вопрос. Вот практический ответ:

Степень сжатия сильно зависит от данных, и ее почти невозможно предсказать. Если таблица не слишком большая, я просто создаю 4 ее копии и сравниваю полученные размеры:

CREATE TABLE t0 (c CLOB) LOB (c) STORE AS SECUREFILE sf0 (NOCOMPRESS);
CREATE TABLE tl (c CLOB) LOB (c) STORE AS SECUREFILE sfl (COMPRESS LOW);
CREATE TABLE tm (c CLOB) LOB (c) STORE AS SECUREFILE sfm (COMPRESS MEDIUM);
CREATE TABLE th (c CLOB) LOB (c) STORE AS SECUREFILE sfh (COMPRESS HIGH);

INSERT INTO t0 SELECT c FROM s0;
INSERT INTO tl SELECT c FROM t0;
INSERT INTO tm SELECT c FROM t0;
INSERT INTO th SELECT c FROM t0;

Теперь вы можете измерить размеры самой таблицы, LOB и индекса LOB:

SELECT b.compression, b.table_name,
       (SELECT sum(bytes) FROM user_segments s 
         WHERE s.segment_name = b.table_name)   as tab_bytes,
       (SELECT sum(bytes) FROM user_segments s 
         WHERE s.segment_name = b.segment_name) as lob_bytes,
       (SELECT sum(bytes) FROM user_segments s 
         WHERE s.segment_name = b.index_name)   as ind_bytes,
       (SELECT sum(bytes) FROM user_segments s 
         WHERE s.segment_name IN (b.table_name, 
                 b.segment_name, b.index_name)) as sum_bytes
  FROM user_lobs b 
 WHERE table_name like 'T%'
 ORDER BY DECODE(b.compression, 'NO',0,'LOW',1,'MEDIUM',2 ,'HIGH',3); 

Если вы используете DISABLE STORAGE IN ROW, вы получите такие размеры:

COMPRESSION TABLE_NAME TAB_BYTES LOB_BYTES IND_BYTES SUM_BYTES
NO          T0             65536  25362432     65536  25493504
LOW         TL             65536  16973824     65536  17104896
MEDIUM      TM             65536   8585216     65536   8716288
HIGH        TH             65536   8585216     65536   8716288

В этом случае я бы сделал go для MEDIUM сжатия, так как 8585216 байт уже подходят достаточно и не улучшается с помощью HIGH compressen.

Если вы используете ENABLE STORAGE IN ROW, большие объекты сохраняются в сегменте таблицы вместо сегмента больших объектов, если их размер меньше 3965 байтов. Поэтому сегмент таблицы обычно больше, чем с DISABLE STORAGE IN ROW:

COMPRESSION TABLE_NAME TAB_BYTES LOB_BYTES IND_BYTES SUM_BYTES
NO          T0            983040  16973824     65536  18022400
LOW         TL           2097152   5439488     65536   7602176
MEDIUM      TM            983040   4390912     65536   5439488
HIGH        TH           1048576   3342336     65536   4456448

Поскольку некоторые большие объекты могут сжиматься настолько хорошо, что становятся меньше 3964 байтов, сегмент таблицы может фактически стать больше при сжатии.

Для этого примера я бы go с ENABLE STORAGE IN ROW и COMPRESS HIGH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...