设计索引时,您必须了解它们的空间需求。对于处于压缩状态的索引而言,可以使用根据本主题中的公式派生的估算值作为上限,但是,实际大小很可能小得多。
处于未压缩状态的索引的空间需求
对于每个处于未压缩状态的索引,可以按如下公式估算所需的空间:
- (平均索引键大小 + 索引键开销) × 行数 × 2
其中:
- 平均索引键大小是索引键中每一列的字节数。估算 VARCHAR 和 VARGRAPHIC 列的平均列大小时,请使用当前数据大小的平均值加上两个字节。
- 索引键开销取决于对其创建索引的表的类型:
表 1. 不同的表的索引键开销表空间的类型 |
表类型 |
索引类型 |
索引键开销 |
任意 |
任意 |
XML 路径或区域 |
11 字节 |
常规 |
非分区 |
任意 |
9 字节 |
分区 |
分区 |
9 |
非分区 |
11 |
大型 |
分区 |
分区 |
11 |
非分区 |
13 |
- number of rows
是表中的行数或给定数据分区中的行数。通过在此计算中使用整个表中的行数,您可以估算索引的大小(对于非分区索引)或者所有索引分区的总大小(对于分区索引)。通过使用数据分区中的行数,可以估算索引分区的大小。
- 因子“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 数据,那么插入时将需要临时空间。可以按如下公式估算所需的临时空间:
估算每个叶子页的键数
可以使用下面这两个公式来估算每个索引叶子页的键数(第二个公式的估算更为准确)。这些估算的
准确度很大程度上取决于平均值反映实际数据的准确程度。
注: 对于
SMS 表空间,叶子页所需的最小空间量是页大小的三倍。对于 DMS 表空间,最小值是一个扩展数据块。
- 每个叶子页的平均键数的粗略估算是:
- ((.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。
- 每个叶子页的平均键数的更准确估算是:
其中,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)。
注: 以上计算适用于单一非分区索引或者分区索引的单一索引分区。
总页数是:
附加的 0.02%(1.0002)表示开销,包括空间映射页。