在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中索引的总大小太大或索引中的部分太多的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 MySql:索引列大小太大(Laravel 迁移)