在informix中,索引的总大小太大或索引中的部分太多

时间:2015-07-09 06:15:56

标签: database indexing informix ddl

我正在尝试在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。

出现此错误的原因是什么,我该如何解决?

2 个答案:

答案 0 :(得分:2)

我相信11.50支持大页面大小,并且要在LVARCHAR(750)(加上4字节INTEGER)的列上创建索引,您需要为持有的dbspace使用更大的页面大小指数。另外,我认为页面大小至少需要4 KiB,而不是你几乎可以肯定使用的默认2 KiB。我记得的经验法则是“每页至少5个索引键”,754个字节加上一些开销,5个键在4 KiB以下发出吱吱声。

这与Bohemiananswer引用的值不同。

有关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)

来自informix documentation

  

您可以在复合索引中包含最多16列。单个复合索引中所有索引列的总宽度不能超过380个字节

您要添加到索引的其中一列是REG_PATH_VALUE LVARCHAR(750); 750字节比允许的最大380长。

你本身无法“修复”这个问题;要么使列大小更小,要么不将其包含在索引中。