Требования к сжатию таблиц в Oracle - PullRequest
1 голос
/ 22 февраля 2010

У меня есть табличное пространство с общим размером 600 МБ (это мой тестовый компьютер) и свободным пространством 110 МБ. Я пытался сжать таблицу размером 120 МБ. Когда выполняются команды:

alter table DOWNLOADSESSIONLOG move compress;

Я получаю сообщение об ошибке:

(Ошибка): ORA-01659: невозможно выделить MINEXTENTS больше 16 в табличном пространстве WAP.

Я искал, и все говорят об увеличении табличного пространства, но я хотел знать, сколько места мне нужно, потому что я не хочу выделять 200/300 МБ дополнительного пространства. Я хотел протестировать это на моей тестовой машине и хотел внедрить в систему Live с табличным пространством 60 ГБ и одной таблицей 47 ГБ. Я хотел сжать 47 ГБ таблицы на работающей системе, до этого я хотел протестировать ее в тестовой среде. Есть ли расчет, сколько места нам нужно дать; в противном случае в реальной системе мне нужно излишне много места, и это сложно.

Цените, кто-то может дать некоторые идеи.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2010

Я бы создал новое выбрасываемое табличное пространство в вашей тестовой среде, которое будет иметь те же характеристики, что и ваше целевое табличное пространство в производственной среде, а затем переместил бы / сжал вашу таблицу в нее. Это даст вам наилучшую оценку того, сколько дополнительного пространства потребуется. Вы можете переместить таблицу обратно в исходное табличное пространство и удалить новое табличное пространство, если у вас есть этот номер.

Помните, что вам понадобится как минимум (оригинальный размер) + (сжатый размер), доступный в табличном пространстве на время перемещения.

2 голосов
/ 23 февраля 2010

Ключевым моментом сжатия является то, что оно работает путем удаления повторяющихся значений в каждом блоке. Таким образом, ваша тестовая таблица должна иметь репрезентативный разброс данных.

Два крайних стола ...

SQL> create table totally_similar
  2      ( txt varchar2(1000) )
  3  /

Table created.

SQL> insert into totally_similar
  2  select rpad('a', 1000, 'a')
  3  from dual connect by level <= 1000
  4  /

1000 rows created.

SQL> create table totally_different
  2      ( txt varchar2(1000) )
  3  /

Table created.

SQL>

Прежде чем сжимать, давайте просто проверим размеры таблицы ...

SQL> insert into totally_different
  2  select dbms_random.string('A',1000)
  3  from dual connect by level <= 1000
  4  /

1000 rows created.

SQL> select segment_name
  2         , sum(bytes)
  3         , sum(blocks)
  4  from user_segments
  5  where segment_name in ('TOTALLY_SIMILAR', 'TOTALLY_DIFFERENT')
  6  group by segment_name
  7  /

SEGMENT_NAME         SUM(BYTES) SUM(BLOCKS)
-------------------- ---------- -----------
TOTALLY_SIMILAR         2097152         256
TOTALLY_DIFFERENT       2097152         256

SQL>

Если мы сжимаем их, мы получаем два совершенно разных результата ...

SQL> alter table totally_similar move compress
  2  /

Table altered.

SQL> alter table totally_different move compress
  2  /

Table altered.

SQL> select segment_name
  2         , sum(bytes)
  3         , sum(blocks)
  4  from user_segments
  5  where segment_name in ('TOTALLY_SIMILAR', 'TOTALLY_DIFFERENT')
  6  group by segment_name
  7  /

SEGMENT_NAME         SUM(BYTES) SUM(BLOCKS)
-------------------- ---------- -----------
TOTALLY_SIMILAR           65536           8
TOTALLY_DIFFERENT       2097152         256

SQL>

Обратите внимание, что TOTALLY_SIMILAR имеет восемь блоков, хотя каждая строка была одинаковой. Поэтому вам необходимо понять распределение ваших данных, прежде чем вы сможете рассчитать степень сжатия. В документации Oracle сказано следующее:

Коэффициент сжатия, который может быть достигнутый зависит от мощности определенный столбец или пары столбцов (представляющий вероятность столбца значение повторений) и в среднем длина строки этих столбцов. оракул Сжатие таблицы не только сжимает повторяющиеся значения одного столбца но пытается использовать значение из нескольких столбцов пары, когда это возможно.

Совет, когда дело доходит до оценки доходности, состоит в том, что выборочная таблица из 1000 блоков целевой таблицы должна дать вам достаточно хороший прогноз (хотя больше блоков дают более точный прогноз). Трудно сказать, не зная вашего размера блока, но кажется вероятным, что ваша таблица TEST намного больше, чем должна быть. Важно то, являются ли данные в тестовой таблице представительными для вашей целевой таблицы. Итак, вы создали его, используя экспорт или образец из целевой таблицы, например,

create table test_table as select * from big_table sample block (1)
/

Вам потребуется отрегулировать процент в предложении SAMPLE (), чтобы получить как минимум 1000 блоков.

редактировать

В большинстве случаев сжатие на самом деле должно ускорять извлечение данных, но YMMV. Стоимость сжатия оплачивается при вставке или обновлении данных. Сколько стоит этот налог и можете ли вы что-либо сделать, чтобы избежать его, скорее зависит от профиля вашего стола.

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