DB2 V10.1 for Linux, UNIX, and Windows

索引的空间需求

设计索引时,您必须了解它们的空间需求。对于处于压缩状态的索引而言,可以使用根据本主题中的公式派生的估算值作为上限,但是,实际大小很可能小得多。

处于未压缩状态的索引的空间需求

对于每个处于未压缩状态的索引,可以按如下公式估算所需的空间:
  • (平均索引键大小 + 索引键开销) × 行数 × 2
其中:
  • 平均索引键大小是索引键中每一列的字节数。估算 VARCHAR 和 VARGRAPHIC 列的平均列大小时,请使用当前数据大小的平均值加上两个字节。
  • 索引键开销取决于对其创建索引的表的类型:
    表 1. 不同的表的索引键开销
    表空间的类型 表类型 索引类型 索引键开销
    任意 任意 XML 路径或区域 11 字节
    常规 非分区 任意 9 字节
    分区 分区 9
    非分区 11
    大型 分区 分区 11
    非分区 13
  • number of rows 是表中的行数或给定数据分区中的行数。通过在此计算中使用整个表中的行数,您可以估算索引的大小(对于非分区索引)或者所有索引分区的总大小(对于分区索引)。通过使用数据分区中的行数,可以估算索引分区的大小。
  • 因子“2”表示开销,如非叶子页和可用空间。
注:
  1. 对于允许空值的每个列,为空指示符添加一个额外的字节。
  2. 对于在内部为多维集群 (MDC) 表或插入时间集群 (ITC) 表创建的块索引,“行数”将被替换为“块数”。

XML 索引的空间需求

对于 XML 列的每个索引,可以按如下公式估算所需的空间:
  • (平均索引键 + 索引键开销) × 建立索引的节点数 × 2
其中:
  • 平均索引键大小是组成索引的键部件的总和。XML 索引由多个 XML 键部件和一个值(sql-data-type)组成:
    • 14 + 可变开销 + sql-data-type 的字节数
    其中:
    • 14 表示固定开销的字节数
    • 可变开销是建立索引的节点的平均深度加上 4 个字节。
    • sql-data-type 的字节数与 SQL 遵循相同的规则。
  • 建立索引的节点数是指,要插入的文档数乘以样本文档中满足索引定义中的 XML 模式表达式(XMLPATTERN)的节点数所获得的结果。建立索引的节点数可以是分区或整个表中的节点数。

创建索引时的临时空间需求

创建索引时,临时空间是必需的。在创建索引期间所需的最大临时空间可以按如下公式估算:
  • (平均索引键大小 + 索引键开销) × 行数 × 3.2
对于那些每行可以有多个索引键的索引(例如空间索引、基于 XML 列的索引以及内部 XML 区域索引),可以按如下方式来估算所需的临时空间量:
  • (平均索引键大小 + 索引键开销) × 建立索引的节点数 × 3.2
其中,因子“3.2”表示索引开销以及索引创建期间进行排序所需的空间。行数建立索引的节点数是整个表中的数目或者给定数据分区中的数目。
注: 对于非唯一索引,在任何给定的叶子节点上,将只存储给定重复键条目的一个副本。对于 LARGE 表空间中的表的索引,重复键的大小是 9(对于非分区索引)或 7(对于分区索引以及非分区表的索引)。对于 REGULAR 表空间中的表的索引,这些值是 7(对于非分区索引)或 5(对于分区索引以及非分区表的索引)。这些规则的例外情况只有 XML 路径和 XML 区域索引,对于这些索引,重复键的大小始终是 7。上面提供的估算值假定没有重复项。因此,以上公式可能会过高地估算存储索引所需的空间量。
如果索引节点数超过 64 KB 数据,那么插入时将需要临时空间。可以按如下公式估算所需的临时空间:
  • 平均索引键大小 × 建立索引的节点数 × 1.2

估算每个叶子页的键数

可以使用下面这两个公式来估算每个索引叶子页的键数(第二个公式的估算更为准确)。这些估算的 准确度很大程度上取决于平均值反映实际数据的准确程度。

注: 对于 SMS 表空间,叶子页所需的最小空间量是页大小的三倍。对于 DMS 表空间,最小值是一个扩展数据块。
  1. 每个叶子页的平均键数的粗略估算是:
    • ((.9 * (U - (M×2))) × (D + 1)) ÷ (K + 7 + (Ds × D))
    其中:
    • U(一页中的可用空间量)大约等于页大小减 100。例如,页大小为 4096 时,U 将是 3996。
    • M = U ÷ (9 + 最小键大小)
    • Ds = 重复键大小(请参阅“创建索引时的临时空间需求”下的说明。)
    • D = 每个键值的平均重复项数目
    • K = 平均键大小

    记住,最小键大小平均键大小必须有一个额外字节,表示每个可空键部分;还必须有两个额外字节,表示每个可变长度键部分的长度。

    如果存在包含列,那么在计算最小键大小平均键大小时应将它们考虑在内。

    最小键大小是组成索引的键部件的总和:
    • 固定开销 + 可变开销 + sql-data-type 的字节数
    其中:
    • 固定开销是 13 字节。
    • 可变开销是建立索引的节点的最小深度加上 4 个字节。
    • sql-data-type 的字节数值与 SQL 遵循相同的规则。

    如果在创建索引期间指定了非缺省值 10% 的一个可用百分比值,那么可以使用任何 (100 - pctfree)/100 值替换 .9

  2. 每个叶子页的平均键数的更准确估算是:
    • 叶子页数 = x / (叶子页中的平均键数)
    其中,x 是表或分区中的总行数。

    对于 XML 列的索引,x 是该列中建立索引的节点总数。

    可按如下方法估算索引的原始大小:
    • (L + 2L/(叶子页中的平均键数)) × 页大小

    对于 DMS 表空间,将一个表上所有索引的大小加在一起,然后四舍五入为该索引所在表空间的扩展数据块大小的一个倍数。

    应该为 INSERT/UPDATE 活动所引起的索引增长提供其他空间,这种增长可能导致分页。

    使用以下计算方法来获得更精确的原始索引大小的估算值,以及该索引中级别数的估算值。(如果索引定义中使用包含列,可能要引起特别注意。)每个非叶子页的平均键数大约是:
    • ((.9 × (U - (M × 2))) × (D + 1))÷(K + 13 + (9 * D))
    其中:
    • U(一页中的可用空间量)大约等于页大小减 100。对于 4096 的页大小,U 是 3996。
    • D 是在非叶子页上每个键值的重复值的平均数(这将比在叶子页上的小很多,您可能想将该值设为 0 以便简化计算)。
    • M = U ÷ (9 + 非叶子页的最小键大小)
    • K = 非叶子页的平均键大小

    只要没有包含列,非叶子页与叶子页的最小键大小平均键大小将是相同的。包含列不存储在非叶子页上。

    除非 (100 - pctfree)÷100 的值大于 .9,否则不应使用它来 替换 .9,因为在创建索引期间会在非叶子页上留下最多 10% 的可用空间。

    可用如下所示的方法估算非叶子页数:
       if L > 1 then {P++; Z++}
       While (Y > 1)
       { 
          P = P + Y
          Y = Y / N
         Z++
       }
    其中:
    • P 是页数(最初为 0)。
    • L 是叶子页数。
    • N 是每个非叶子页的键数。
    • Y = L ÷ N
    • Z 是索引树中的级别数(最初为 1)。
    注: 以上计算适用于单一非分区索引或者分区索引的单一索引分区。
    总页数是:
    • T = (L + P + 2) × 1.0002
    附加的 0.02%(1.0002)表示开销,包括空间映射页。
    创建索引所需的空间容量估算为:
    • T × 页大小