我在项目中使用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
答案 0 :(得分:2)
SQL0614N的documentation清楚地说明了这一点: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
语句,请参阅文档以了解详细信息。
对于大型表,如果许可和硬件允许,请考虑使用范围分区和哈希分区。