我有一个总大小为600 MB的表空间(这是我的测试机器),可用空间为110 MB。我试图压缩一个大小为120 MB的表。执行命令时:
alter table DOWNLOADSESSIONLOG move compress;
我收到错误说:
(错误):ORA-01659:无法在表空间WAP中分配超过16的MINEXTENTS。
我正在搜索并且都在说增加Tablespace,但我想知道需要多少空间,因为我不想给出200/300 MB的额外空间。我想在我的测试机器上进行测试,并希望在具有60 GB表空间和一个47 GB表的Live系统上实现。我想在实时系统上压缩47 GB表,之前我想在测试环境中测试它。有没有计算我们需要多少空间;否则在现场系统上我需要不必要地提供大量空间而且很难。
欣赏有人可以提出一些想法。
答案 0 :(得分:3)
我会在您的测试环境中创建一个新的丢弃表空间,该表空间与生产环境中的目标表空间具有相同的特性,然后将表移动/压缩到该表空间。这将为您提供所需额外空间的最佳估计。您可以将表移回原始表空间,并在获得此编号后删除新的表空间。
请记住,在移动期间,您至少需要(原始大小)+(压缩大小)才能在表空间中使用。
答案 1 :(得分:2)
关于压缩的关键是它通过删除每个块中的重复值来工作。因此,您的测试表需要具有代表性的数据传播。
两个极端的表......
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也只有8个块。因此,在计算压缩比之前,您需要了解数据的分布。 Oracle documentation可以这样说:
可以的压缩因子 实现取决于基数 特定的列或列对 (代表列的可能性 价值重复)和平均值 这些列的行长度。神谕 表压缩不仅压缩 单个列的重复值 但尝试使用多列值 尽可能配对。
在估算回报时,它的建议是,目标表的1000个块的样本表应该给你一个足够好的预测(尽管更多的块给出更准确的预测)。在不知道你的块大小的情况下很难分辨,但看起来你的TEST表可能比它需要的大得多。重要的是测试表中的数据是否代表您的目标表。那么,您是使用目标表中的导出还是样本创建的,例如
create table test_table as select * from big_table sample block (1)
/
您需要调整SAMPLE()子句中的百分比,以确保获得至少1000个块。
修改强>
在大多数情况下,压缩实际上应该加速数据检索,但是YMMV。插入或更新数据时支付压缩成本。税收是多少以及您是否可以采取任何措施来避免税收取决于您的餐桌的情况。