Это очень, очень хороший вопрос. Вот практический ответ:
Степень сжатия сильно зависит от данных, и ее почти невозможно предсказать. Если таблица не слишком большая, я просто создаю 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
.