此页面为机器翻译。请阅读英文原文。 English

IBSurgeon 文库

InterBase(2009年之前)中的最大表大小

Dmitry Kuzmenko,2009年10月20日

在处理一位客户的趣味技术支持事件时,我们发现实际的最大行数与声明的限制有所不同。

在文档集[InterBase 6操作指南,第27页,InterBase规范]中,我们可以读到以下内容:

“每个表的最大行数和列数:按设计,2^32行,因为每张表的行使用32位无符号整数进行枚举。”

当然,行是通过32位整数枚举的。遗憾的是,实际上没有任何表能达到20亿条记录的限制–即使是只有一列的表也不行。

这种行为的原因在于计算新(插入)记录可用空间的算法–可能会发生整数溢出,您将在interbase.log中看到以下错误消息:

pointer page vanished from DPM_next (249)

而且,实际情况是,数据库页面大小或行大小并不影响此限制。该限制是一个神奇的表大小,始终相同(约36.6 GB),可以针对任何数据库页面大小以页数计算如下:

一张表的最大页数可以计算为

MaxDataPageCount = (MaxInt / PageSize) * 17.476

当然,MaxInt = 2147483647。将您的数据库页面大小替换为PageSize,结果将显示可为任何表分配的页数。

例如,在4K页面大小的数据库中,表不能拥有超过约900万个数据页。

从记录数量的角度来看,具有2个整数列的表不能增长超过6亿(!)条记录(别忘了每条记录都有14字节的头部)。

感到困惑吗?将MaxDataPageCount乘以PageSize,再将结果除以您最大表的平均记录大小–您就会知道该表何时会超过限制,届时您的数据库将停止工作

此限制仅在Firebird 2中修复。在InterBase 2007中仍然存在。

如果您对此页面上的信息有疑问或建议,请随时通过[email protected]联系我们的研究团队。我们也欢迎任何与InterBase或Firebird相关的有趣和/或奇怪的信息。