估计常规索引页

可以使用一系列公式来估计索引页的大小。

要估算索引页面的数量:

  1. 将单个或多个索引列的宽度进行加总。

    所得到的值称为 colsize。将 colsize 加上 4,那么 得到 keysize,该值是索引中的键的实际大小。 例如:如果 colsize 为 6,那么 keysize 的值为 10。

  2. 计算唯一条目占行总数的期望比例。

    后续步骤中的公式将此值看作 propunique

    如果索引是唯一的,或者只有极少数的重复值,那么对 propunique 赋值为 1。

    如果很大比例的条目是重复的,那么用表中唯一索引条目的个数除以表的行数,将所得的小数值赋给 propunique。 例如:如果表中的行数为 4,000,000,唯一索引条目的个数为 1,000,000,那么 propunique 的值为 .25。

    如果 propunique 的结果 小于 .01,那么在以下的计算中使用值 .01。

  3. 选用以下公式之一估算典型的索引条目的大小,选择的依据是该表是否分段:
    1. 对于未分段表,使用以下公式:
      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
    2. 对于分段表,使用以下公式:
      entrysize = (keysize * propunique) + 9 + 4
      

      9 代表分段表中行指针所占字节数。

  4. 使用以下公式估算每个索引页中的条目数:
    pagents = trunc(pagefree/entrysize)
    

    在此公式中:

    • pagefree 是页大小减去页头(对于大小为 2 KB 的页,页头为 2020)。
    • entrysize 是典型索引条目的大小,该值在上一步中估计。

    trunc() 函数符号表示,应该向下舍入 到最接近的整数值。

  5. 使用以下公式估算叶子页的数目:
    leaves = ceiling(rows/pagents) 
    

    在此公式中:

    • rows 为表中期望的行数。
    • pagents 是每个索引页的条目数,该值在上一步中估计。

    ceiling() 函数符号表示,应该向上舍入到最接近的整数值。

  6. 使用以下公式估算索引的第二层枝页的数目:
    branches0 = ceiling(leaves/node_ents)
    

    使用以下公式计算 node_ents 的值:

    node_ents = trunc( pagefree / ( keysize + 4) + 4)
    

    在此公式中:

    • pagefree 是页大小减去页头(对于大小为 2 KB 的页,页头为 2020)。
    • keysizecolsize 加上 4。在步骤 1 中获取此值。

    在该公式中,4 表示页节点指针所占字节数。

  7. 如果 branches0 的值 大于 1,那么索引中包含更多的层次。

    要计算索引的下一层次中包含的页数,请使用以下公式:

    branchesn+1 = ceiling(branchesn/node_ents)
    

    在此公式中:

    • branchesn 是计算出的上一索引层次中的分支数。
    • branchesn+1 是下一层次中的分支数。
    • node_ents 是在步骤 6 中计算的值。
  8. 对该索引中的每一层,均重复步骤 7 中的计算,直到 branchesn+1 的值等于 1。
  9. 将步骤 6 到步骤 8 中计算出的所有枝层次的页数进行加总,所得的总数称为 branchtotal
  10. 使用以下公式计算压缩索引中的页数:
    compactpages = (leaves + branchtotal)
    
  11. 如果数据库服务器实例对索引使用一个填充因子,那么该索引的大小就会增加。

    缺省的填充因子是 90%。您可以使用 FILLFACTOR 配置参数来更改所有索引的填充因子值。您还可以使用 SQL 中 CREATE INDEX 语句的 FILLFACTOR 子句来更改个别索引的填充因子。

    要在估算索引页时并入填充因子,请使用以下公式:
    indexpages = 100 * compactpages / FILLFACTOR
    

以上估算方法只用作准则。由于可能会删除旧行和插入新行,所以页内的索引条目数会发生变化。 对于大多数索引而言,这种估计索引页的方法会得到一个保守(偏高)的估计值。 要得到更精确的值,请使用真实数据构建一个大型测试索引,并使用 oncheck 实用程序检查其大小。

提示: 森林树索引可以大于 B 型树索引。估计森林树索引的大小时,估计值会应用于索引中的每个子树。然而,您必须聚集存储区来计算总估计值。