首页 > 解决方案 > 为 DB2 中的现有表添加表空间

问题描述

我在我的项目中使用 DB2。我有一个具有以下 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],它解释了为长列创建索引添加大表空间。但这适用于新表。为现有表添加它的正确方法是什么?

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

标签: databasedb2alter-tabletablespace

解决方案


SQL0614N的文档清楚地解释了这一点,一个 4K 页面大小的表空间允许最大 1K 键长度,一个 8KB 页面大小表空间允许最大 2k 键长度,16KB 页面大小允许最大 4k 键长度,32kb 页面大小允许最大 8kb 键长度。

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

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

创建(或重新使用合适的现有)一个 8KB 页面大小的缓冲池(CREATE BUFFERPOOL)创建(或重新使用合适的现有)一个 8KB 表空间(CREATE TABLESPACE)以使用匹配页面大小的新缓冲池。

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

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

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

对于非常大的表,如果许可和硬件允许,请考虑使用范围分区和哈希分区。


推荐阅读