使用带有 table 或 fragment 参数的 SQL 管理 API 函数来创建压缩字典、来估计压缩率、来压缩表和表分片中的数据、来合并空闲空间(重新打包)、 来归还空闲空间到 dbspace(收缩)、来解压缩数据,以及来删除压缩字典。
当您运行 SQL 管理 API 压缩和解压缩命令时,您压缩或解压缩 dbspace 中的行数据和简单大对象。您还可指定是否仅压缩或解压缩行数据,或仅压缩或解压缩 dbspace 中的简单大对象。
下表描述每一参数。
参数 | 描述 |
---|---|
blobs | 指定您仅想要压缩或解压缩 dbspace 中的简单大对象,而不是行数据。 |
compress | 就地压缩所有现有的行,而不移动它们(不重新打包表)。
这个选项自动地压缩 dbspace 中的行数据和简单大对象。要仅压缩行数据或仅压缩 dbspace 中的简单大对象,还要使用 rows 或 blobs 元素。 如果目标表或分片的压缩字典不存在,则压缩操作还创建该字典。 |
create_dictionary | 构建压缩字典。压缩字典是频繁地发生的模式和符号库,在压缩的行中取代它们。
创建字典之后,如果新插入的或更新的行可以压缩,则会压缩它们。 |
estimate_compression | 估计新的压缩率和当前的压缩率。如果该表未压缩,则当前压缩率为 0.0%。 |
parallel | 并行地运行压缩、重新打包、update_ipa 或解压缩操作。为每个表的分片或分片列表启动一个线程,跨那些分片并行地运行该操作。 |
purge_dictionary | 在您解压缩表或分片之后,删除不活动的压缩字典。 |
repack | 通过将数据移至分片或表的前部合并空闲空间。
在分片处于 online 时,因为重新打包操作移动行,所以访问正在使用隔离级别低于 Repeatable Read 的分片的其他查询可能偶尔地找到同一行两次或找不到行。要避免这种可能性,请为并发查询使用 Repeatable Read 隔离级别;或者,不使用 repack 参数,而使用 repack_offline 参数。 |
repack_offline | 在表或分片上持有排他锁时,通过将数据移至表或分片的前部,合并空闲空间。这个操作阻止所有其他对数据的访问,直到该操作完成。 |
rows | 指定您仅想要压缩或解压缩行数据,而不是 dbspace 中的简单大对象。 |
shrink | 将分片或表后部的空闲空间归还到 dbspace,从而减少该分片或表的合计大小。 |
uncompress | 停止对新的 INSERT 和 UPDATE
操作压缩,解压缩所有压缩的行,并停用压缩字典。这个操作还为分片分配新的页,并将那些在原始页上不再适合的解压缩的行移至新页。
在分片处于 online 时,因为这个操作移动行,所以正在访问使用低于 Repeatable Read 隔离级别的分片的其他操作可能偶尔地找到同一行两次或找不到行。为了避免这种可能性,请为并发查询使用 Repeatable 隔离级别,或不使用 uncompress 参数,而使用 uncompress_offline 参数。 这个选项自动地解压缩 dbspace 中的行数据和简单大对象。要仅压缩行数据或仅压缩 dbspace 中的简单大对象,还请使用 rows 或 blobs 元素。 |
uncompress_offline | 在持有分片上的排他锁时,停止对新的 INSERT 和 UPDATE 操作压缩,解压缩所有压缩的行,并停用压缩字典。这样阻止对分片数据的所有其他访问,直到该操作完成。
这个操作还为分片分配新的页,并将那些在其原始页上不再适合的解压缩的行移至新的页。 |
update_ipa | 为指定的表或分片移除未完成的就地更改操作。 |
元素 | 描述 | 关键考虑 |
---|---|---|
database_name | 包含指定的表的数据库名。 | 可选的。
如果您未指定 database,则 GBase 8s 使用当前数据库。 如果您输入数据库名,则必须使用与系统目录表中相同的大写或小写字母。 |
owner | 包含指定的表的数据库所有者的授权标识符。 | 可选的。
如果您未指定 owner,则 GBase 8s 使用当前的所有者。 如果您输入所有者名,则必须使用与系统目录表中相同的大写或小写字母。 |
table_name | 包含数据的表名。 |
您必须使用与系统目录表中相同的大写或小写字母。 |
元素 | 描述 | 关键考虑 |
---|---|---|
partition_number | 属于同一表的用空格分隔的分区号列表。 |
GBase 8s 使用压缩字典来压缩数据。
您在表或分片上运行 compress 命令之后, GBase 8s 自动地压缩您添加到表或分片的任何新行。当您运行 compress 时,如果表或分片包含的行数多于 2000,则构建压缩字典且压缩所有行。当您运行压缩命令时,如果表或分片包含的行数少于 2000,则启用该表或分片的自动压缩。插入 2000 行之后,创建压缩字典并压缩初始 2000 行之后的所有行。要压缩初始的 2000 行,请再次运行 compress 命令。
如果您显著地更改数据,则压缩字典可能无效。在这种情况下,请解压缩然后再压缩。
您可取消带有 compress 或 uncompress 参数的命令,例如,在 DB-Access 中键入 CTRL-C。在前一个中断的命令之后,您可重新发出带有 repack、 repack_offline、uncompress 和 uncompress_offline 参数的命令。
在表或分片上已发生了 compress、repack、repack_offline、shrink、uncompress 或 uncompress_offline 操作的任何一个时,您不可在表或分片上执行这些操作。
compress、repack、repack_offline、uncompress 和 uncompress_offline 操作可消耗大量日志文件。如果包括但不限于这些压缩操作,您预期运行的任何工作负载消耗日志文件快于每 30 秒一个,则请将日志配置大些。
日志记录 compress、repack 和 uncompress 操作,但运行在小部分中。
在执行压缩操作之后,如果您更改分片策略,则表失去其压缩状态,并将需要重新压缩。
在您完成repack_offline 或 uncompress_offline 操作之前删除或禁用索引,可减少数据库完成该操作所花费的时间量。随后,您可重新创建或重新启用这些索引,最好利用 PDQ。删除或禁用索引,然后再创建或启用它们,与不这么做比起来,可更快地完成 repack_offline 或 uncompress_offline 操作。
如果 dbspace 曾包含压缩的表,请别删除正在使用“更改数据捕获”(CDC)的 dbspace,因为这可能删除 CDC 仍需要的压缩字典。
压缩操作通常在个别数据和剩余页上创建一些空闲空间,但该空间不合并在表或分片的后部。相反,该空间可用于保持新插入的行,表不再增大直到这个空间填满。
仅发生在 online 的压缩操作就地压缩表的行。重新打包操作移动这些行。您可 online 或 offline 执行重新打包操作。online 操作允许在表上发生并发活动。 然而,这可导致 phantom rows。(幻象行是在后来回滚的事务期间初始地更改或插入的那些行。)
要避免幻象行,当您可经得起使得其他用户不能访问表或分片时,您可能想要重新打包 offline。例如,您可以在日间执行带有并发活动的压缩操作,然后当预计表上没有并发活动时,在晚间执行 repack_offline 操作。
您不可执行带有 online 操作的 offline 操作。例如,在您可执行压缩与重新打包相结合的操作时,您不可执行压缩与 repack_offline 相结合的操作。如果您想要重新打包 offline,则必须分两步做到:
类似地,您不可执行 repack_offline 与收缩操作。
在发生重新打包操作时,如果在表中发生轻量级追加(无缓冲区的、无日志记录的插入操作),则重新打包操作不在表或分片的后部完成空间合并。重新打包操作未完成是因为新的 extent 添加在重新打包操作已经发生的位置中,所以不能将空间归还到 dbspace。要完成重新打包进程,您必须在轻量级追加活动完成后运行第二次重新打包操作。这个第二次重新打包操作构建在第一次重新打包操作的成果之上。
通常在重新打包操作之后执行收缩操作。
不损害表的分配策略妥协,您可稳妥地收缩整个表。例如,如果您有一分片的表,一周的每天一个分片,并为未来使用而预先分配了许多分片,则您可收缩该表,而不损害这个分配策略。如果该表为空,则 GBase 8s 将表收缩到当该表创建时指定的初始 extent 大小。
您可使用 ALTER TABLE 语句的 MODIFY EXTENT SIZE 子句来减小当前 extent 大小。您这么做之后,可重新运行收缩操作来将第一个 extent 收缩到新的 extent 大小。
对任何未压缩的表或表的分片,解压缩操作无效。
解压缩表或分片之后,您可执行 purge_dictionary 操作来删除那个表或分片的字典。
对表和分片执行 purge_dictionary 操作之前,您必须:
当您解压缩表或分片时, GBase 8s 将该表或分片的字典标记为不活动的。
您还可删除所有压缩字典或在指定日期之前以及那天创建的所有压缩字典。要了解相关信息,请参阅清除压缩字典参数:移除压缩字典(SQL 管理 API)。
下列命令压缩、重新打包和收缩 insurance 数据库中名为 auto 的表中 dbspace 中的行数据和简单大对象。该数据库所有者为 tjones。
EXECUTE FUNCTION task("table compress repack shrink","auto", "insurance","tjones");
下列命令仅并行地压缩名为 dental 的表中的行数据。
EXECUTE FUNCTION task("table compress rows parallel","dental");
下列命令解压缩分区号为 14680071 的分片。
EXECUTE FUNCTION task("fragment uncompress","14680071");
下列命令仅并行地解压缩分区号为 14680071 的分片中的行数据。
EXECUTE FUNCTION task("fragment uncompress rows parallel","14680071");下列命令估计 insurance 数据库中名为 home 的 表的压缩收益,该数据库的所有者为 fgomez。
EXECUTE FUNCTION task("table estimate_compression","home", "insurance","fgomez");
下列命令并行地移除名为 auto 的表上挂起的就地更改操作。
EXECUTE FUNCTION task("table update_ipa parallel","auto");
在您运行该命令之后,数据库服务器显示您可取得的压缩率,以及当前取得的压缩率( 如果存在的话)。要了解关于该命令输出的信息,请参阅估计压缩操作的输出(SQL 管理 API)。