为 DB2 中现有的 table 添加 table 空间

Add tablespace for existing table in DB2

我在我的项目中使用 DB2。我有一个 table,其中包含以下 DDL:

CREATE TABLE TEST (
            ID INTEGERT NOT NULL,
            ACCESS_INFO VARCHAR (2048) NOT NULL,
            NAME VARCHAR (2048))

尝试为列 "ACCESS_INFO" 创建索引时,出现以下错误:

The index or index extension "xxxx" cannot be created or altered because the combined length of the specified columns is too long..

我提到了 [1],它解释了添加大的 table 空间来为长列创建索引。但这是针对新 table 的。为现有 table 添加它的正确方法是什么?

[1] https://dba.stackexchange.com/questions/19894/create-index-for-long-columns

SQL0614N 的 documentation 清楚地解释了这一点,4K 页面大小 table 空间允许最大 1K key-length,8KB 页面大小 table 空间允许最大 2k 密钥长度, 16KB 页面大小允许最大 4k key-length, 32kb 页面大小允许最大 8kb 密钥长度。

您可以在下一个更高的页面大小中重新创建 table 以避免此问题。

我假设您使用的是 4Kb 页面大小 table空间(这是默认值),因此下一个更高的页面大小是 8KB。

创建(或 re-use suitable 现有)一个 8KB 页面大小的缓冲池 (CREATE BUFFERPOOL ) 创建(或 re-use suitable 现有)8KB table 空间 (CREATE TABLESPACE) 以使用匹配页面大小的新缓冲池。

如果 table 已经包含您不想重新加载的数据,则使用存储过程 ADMIN_MOVE_TABLE 将现有数据移动到新的 table 空间.

如果 table 不包含任何行(或可以快速重新加载),则删除 table 并使用修改后的 DDL 重新创建以添加 IN $your_8kb_tablespace.

如果 table 将包含数百万行,明智的做法是将其拆分为三个 table 空间(一个用于数据,一个用于索引,一个用于长数据)- 您可以也可以使用 create table 语句执行此操作,有关详细信息,请参阅文档。

对于非常大的 table,如果许可和硬件允许,请考虑使用 range-partitioning 和 hash-partitioning。