我正在尝试在informix上运行以下脚本:
CREATE TABLE REG_PATH (
REG_PATH_ID SERIAL UNIQUE,
REG_PATH_VALUE LVARCHAR(750) NOT NULL,
REG_PATH_PARENT_ID INTEGER,
REG_TENANT_ID INTEGER DEFAULT 0,
PRIMARY KEY(REG_PATH_ID, REG_TENANT_ID) CONSTRAINT PK_REG_PATH
);
CREATE INDEX IDX1 ON REG_PATH(REG_PATH_VALUE, REG_TENANT_ID);
但它会出现以下错误:
517:索引的总大小太大或索引中的部分太多。
我正在使用informix版本11.50FC9TL。我的dbspace块大小是5M。
出现此错误的原因是什么,我该如何解决?
答案 0 :(得分:2)
我相信11.50支持大页面大小,并且要在LVARCHAR(750)(加上4字节INTEGER)的列上创建索引,您需要为持有的dbspace使用更大的页面大小指数。另外,我认为页面大小至少需要4 KiB,而不是你几乎可以肯定使用的默认2 KiB。我记得的经验法则是“每页至少5个索引键”,754个字节加上一些开销,5个键在4 KiB以下发出吱吱声。
有关Informix 12.10的文档,请参阅IDS 12.10 Information Center。
最后一个引用有一个dbspace页面大小和允许的最大密钥大小表:
Page Size Maximum Index Key Size
2 kilobytes 387 bytes
4 kilobytes 796 bytes
8 kilobytes 1,615 bytes
12 kilobytes 2,435 bytes
16 kilobytes 3,245 bytes
如果11.50不支持大页面大小,则必须迁移到较新版本(推荐12.10,可能性为11.70),如果必须创建此类索引。
另一个需要考虑的可能性是你是否真的想要这么大的密钥字符串;你可以把它减少到350字节吗?那将适合您当前的系统。
答案 1 :(得分:1)
您可以在复合索引中包含最多16列。单个复合索引中所有索引列的总宽度不能超过380个字节。
您要添加到索引的其中一列是REG_PATH_VALUE LVARCHAR(750)
; 750
字节比允许的最大380
长。
你本身无法“修复”这个问题;要么使列大小更小,要么不将其包含在索引中。