可以使用一系列公式来估计索引页的大小。
要估算索引页面的数量:
所得到的值称为 colsize。将 colsize 加上 4,那么 得到 keysize,该值是索引中的键的实际大小。 例如:如果 colsize 为 6,那么 keysize 的值为 10。
后续步骤中的公式将此值看作 propunique。
如果索引是唯一的,或者只有极少数的重复值,那么对 propunique 赋值为 1。
如果很大比例的条目是重复的,那么用表中唯一索引条目的个数除以表的行数,将所得的小数值赋给 propunique。 例如:如果表中的行数为 4,000,000,唯一索引条目的个数为 1,000,000,那么 propunique 的值为 .25。
如果 propunique 的结果 小于 .01,那么在以下的计算中使用值 .01。
entrysize = (keysize * propunique) + 5 + 4
5 代表未分段表中行指针所占字节数。
对于非唯一索引,数据库服务器存储索引节点中每一行的行指针,但键值只存储一次。entrysize 值表示每个索引条目的平均长度,即使某些条目只包括行指针。
例如,如果 propunique 为 .25,那么每个唯一键值的平均行数为 4。如果 keysize 为 10,那么 entrysize 的值为 11.5,按如下方式计算:(10 * 0.25) + 5 + 4 = 2.5 + 9 = 11.5。以下计算 显示所有 4 行必需的空间:
4 行的空间 = 4 * 11.5 = 46
如果使用键值所占空间大小,加上 4 个行指针所占空间大小进行计算,那么所得的空间需求与上述结果相同,如以下公式所示:
4 行的空间 = 10 + (4 * 9) = 46
entrysize = (keysize * propunique) + 9 + 4
9 代表分段表中行指针所占字节数。
pagents = trunc(pagefree/entrysize)
在此公式中:
trunc() 函数符号表示,应该向下舍入 到最接近的整数值。
leaves = ceiling(rows/pagents)
在此公式中:
ceiling() 函数符号表示,应该向上舍入到最接近的整数值。
branches0 = ceiling(leaves/node_ents)
使用以下公式计算 node_ents 的值:
node_ents = trunc( pagefree / ( keysize + 4) + 4)
在此公式中:
在该公式中,4 表示页节点指针所占字节数。
要计算索引的下一层次中包含的页数,请使用以下公式:
branchesn+1 = ceiling(branchesn/node_ents)
在此公式中:
compactpages = (leaves + branchtotal)
缺省的填充因子是 90%。您可以使用 FILLFACTOR 配置参数来更改所有索引的填充因子值。您还可以使用 SQL 中 CREATE INDEX 语句的 FILLFACTOR 子句来更改个别索引的填充因子。
indexpages = 100 * compactpages / FILLFACTOR
以上估算方法只用作准则。由于可能会删除旧行和插入新行,所以页内的索引条目数会发生变化。 对于大多数索引而言,这种估计索引页的方法会得到一个保守(偏高)的估计值。 要得到更精确的值,请使用真实数据构建一个大型测试索引,并使用 oncheck 实用程序检查其大小。