压缩 Oracle 中的选择性行 (19c)

问题描述 投票:0回答:1

我需要压缩 Oracle 中的选择性行。我想看看是否可能。 到目前为止,我已经读到这是不可能的(除了解决方法)。

我无法进行 CTAS。我的桌子大小是 2 T.B. 无法创建新列;数据库存储空间已达到最大值 有些表有没有 LOB 的常规列。有些有 CLOB,有些有 BLOB。

oracle compression clob oracle19c
1个回答
0
投票

您绝对可以压缩某些行,但不能通过逐行命令或属性来压缩(您无法就地压缩现有行,只能在加载或重组/段移动时压缩)。

启用非高级(非 OLTP)压缩时,无论是 Basic 还是 HCC (Exadata),压缩属性仅对新行产生影响,并且仅在某些条件下产生影响:

  1. 基本压缩仅适用于直接路径

    INSERT SELECT
    (例如需要
    APPEND
    提示或PDML模式)。它不适用于以常规方式插入的行。

  2. HCC 压缩最初也仅应用于直接路径插入。然而,在最近的版本(19c?)中,任何数组插入,即使不是直接插入(没有

    APPEND
    提示),都可以进行 HCC 压缩。
    INSERT VALUES
    然而不会。您可以利用它来故意加载一些压缩的行,而另一些则不加载。

  3. 这两种压缩设置都没有说明表中已有的行。这允许一些有趣的策略:

    3a. 使用直接路径批量插入或 CTAS,对相对不活动的历史/旧数据启用压缩,然后禁用压缩并在顶部插入较新/活动的行。较新/活动的行将被解压缩,而较旧的行将被压缩,这是节省空间的常见模式,而不影响应用程序插入或更新最近/活动行的性能。

    3b. 压缩现有表 (

    alter table ... move compress ...
    ),然后将其压缩设置为关闭,以便将来到达的任何新行都将被解压缩。这也是节省空间而不影响应用程序插入性能的常见模式。

    3c. 对表进行分区(通常按日期),以便可以使用

    alter table move partition ... compress
    命令压缩较旧的分区,而不压缩较新的分区。这比 #3a 和 #3b 更容易管理,并且可以实现相同的目标。鉴于您的特定表为 2TB,听起来您确实需要出于多种原因使用分区。

正如您所看到的,有多种方法可以压缩某些行,而另一些则不压缩。事实上,在 Exadata 中的同一个表中,您可以混合使用所有四种 HCC 类型:基本、高级/OLTP 和未压缩。不幸的是,数据字典不会告诉您表的压缩状态是什么,只会告诉您什么规则将应用于传入或移动的新数据。要找出表中行的当前压缩细分,您必须实际查询表并使用

dbms_compression.get_compression_type
函数。

© www.soinside.com 2019 - 2024. All rights reserved.