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

Posted

技术标签:

【中文标题】在informix中索引的总大小太大或索引中的部分太多【英文标题】:The total size of the index is too large or too many parts in index in informix 【发布时间】:2015-07-09 06:15:56 【问题描述】:

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

这个错误的原因是什么,我该如何解决?

【问题讨论】:

【参考方案1】:

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

这与Bohemian在他的answer中引用的值不同。

有关 Informix 12.10 的文档,请参阅 IDS 12.10 Information Center。

Creating a dbspace with a non-default page size CREATE INDEX statement Index key specification

最后一个参考有一个 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 字节吗?这将适合您当前的系统。

【讨论】:

【参考方案2】:

来自informix documentation:

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

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

你不能“解决”这个问题;要么缩小列大小,要么不将其包含在索引中。

【讨论】:

这是我正在使用的版本问题,还是在所有informix 版本和版本中都会出现这种情况?其他版本是否使用不同的限制? @ChamilaWijayarathna 您可以自己查看文档,但我希望它会在各个版本中保持不变。

以上是关于在informix中索引的总大小太大或索引中的部分太多的主要内容,如果未能解决你的问题,请参考以下文章

更新informix中的行时如何修复错误-245

如何修复 MySql:索引列大小太大(Laravel 迁移)

如何在 Informix 中创建 BTS 索引

Elasticsearch rollover index滚动索引

数据量太大,分页查询变慢,有啥优化查询的方法吗

获取整个索引中的总词频(Elasticsearch)