使用 CREATE INDEX 语句的 HASH ON 子句指定森林树索引的子树(存储区)的数目及其列。
森林树索引是拆离的索引。它们不能是连接的索引。
您可以在基本数据类型的列上创建森林树索引。
您不能:
然而,您可以在不列在 HASH ON 列列表的列上执行范围扫描。对于在 HASH ON 列列表列出的列的范围扫描,您必须创建包含此范围扫描的适当列表的附加 B-tree 索引。该附加 B-tree 索引可能具有与森林树索引相同的列列表,加或减一列。
当您创建森林树索引时,选择足够的列以创建唯一值。
Tip: 一般情况下,要选择的列取决于每一列的副本数。例如,如果第一列包含很少量的副本,如果前两列不包含大量副本,则前两列满足散列。如果前两列包含大量的副本,则您还需要选择第三个列。
子树的数目取决于您创建的索引的目的。如果您的目的是:
例如,假设一个索引每页均有 100 个键,该索引有 1M 个键,则该树则看起来像这样:
要将 3-level tree 减少到 100 2-level tree, 该索引大概需要 100 个子树。要将 3-level tree 减少到 10K 1-level tree ,该索引大概需要 10K 个子树。
如果使用了太多的或太少的子树,则森林树页面可以比传统的 B-tree 页面更稀疏。当页面稀疏时,更多页占据缓冲池,这将导致其它表的缓存变得更少。
以下命令创建了名为 idx1 的森林树索引,它在 c1 列上有 100 个子树:
CREATE INDEX idx1 ON tab1(c1) HASH ON (c1) with 100 buckets;
以下命令创建了名为 idx2 的森林树索引。在此命令中,该语句的 HASH ON 部分的前缀列表是 c1 和 c2,它是在该语句的 CREATE INDEX 部分中使用的 c1 、c2 和 c3 列的前缀列表:
CREATE INDEX idx2 on tab2(c1, c2, c3) HASH ON (c1, c2) with 10 buckets;
以下命令在列 c1 和列 c2 上创建了一个等式查找的森林树索引:
CREATE INDEX idx3 on tab3(c1, c2) HASH ON (c1, c2) with 100 buckets;
以下命令创建了类似于先前森林树索引的 B-tree 索引。该索引用于列 c1 和列 c2 的范围扫描:
CREATE INDEX idx4 on tab4(c1, c2, c3);