我需要压缩 Oracle 中的选择性行。我想看看是否可能。 到目前为止,我已经读到这是不可能的(除了解决方法)。
我无法进行 CTAS。我的桌子大小是 2 T.B. 无法创建新列;数据库存储空间已达到最大值 有些表有没有 LOB 的常规列。有些有 CLOB,有些有 BLOB。
您绝对可以压缩某些行,但不能通过逐行命令或属性来压缩(您无法就地压缩现有行,只能在加载或重组/段移动时压缩)。
启用非高级(非 OLTP)压缩时,无论是 Basic 还是 HCC (Exadata),压缩属性仅对新行产生影响,并且仅在某些条件下产生影响:
基本压缩仅适用于直接路径
INSERT SELECT
(例如需要APPEND
提示或PDML模式)。它不适用于以常规方式插入的行。
HCC 压缩最初也仅应用于直接路径插入。然而,在最近的版本(19c?)中,任何数组插入,即使不是直接插入(没有
APPEND
提示),都可以进行 HCC 压缩。 INSERT VALUES
然而不会。您可以利用它来故意加载一些压缩的行,而另一些则不加载。
这两种压缩设置都没有说明表中已有的行。这允许一些有趣的策略:
3a. 使用直接路径批量插入或 CTAS,对相对不活动的历史/旧数据启用压缩,然后禁用压缩并在顶部插入较新/活动的行。较新/活动的行将被解压缩,而较旧的行将被压缩,这是节省空间的常见模式,而不影响应用程序插入或更新最近/活动行的性能。
3b. 压缩现有表 (
alter table ... move compress ...
),然后将其压缩设置为关闭,以便将来到达的任何新行都将被解压缩。这也是节省空间而不影响应用程序插入性能的常见模式。
3c. 对表进行分区(通常按日期),以便可以使用
alter table move partition ... compress
命令压缩较旧的分区,而不压缩较新的分区。这比 #3a 和 #3b 更容易管理,并且可以实现相同的目标。鉴于您的特定表为 2TB,听起来您确实需要出于多种原因使用分区。
正如您所看到的,有多种方法可以压缩某些行,而另一些则不压缩。事实上,在 Exadata 中的同一个表中,您可以混合使用所有四种 HCC 类型:基本、高级/OLTP 和未压缩。不幸的是,数据字典不会告诉您表的压缩状态是什么,只会告诉您什么规则将应用于传入或移动的新数据。要找出表中行的当前压缩细分,您必须实际查询表并使用
dbms_compression.get_compression_type
函数。