我会假设作者在谈到“两部分单一索引”时指的是复合索引。术语“复合索引”是一种更常见的方式来指代表的多个列上的索引。
如果您在两列上有一个复合索引,则在插入期间只需要维护一个索引结构,因此索引维护的开销与维护一个单列索引的开销差别不大。
CREATE TABLE t1 (
col1 NUMBER,
col2 NUMBER,
col3 NUMBER
);
CREATE INDEX t1_composite_idx
ON t1( col1, col2 );
另一方面,如果您在每列上单独创建单独的索引,Oracle 必须维护两个单独的索引结构,这大约会使所需的索引维护量增加一倍
CREATE TABLE t1 (
col1 NUMBER,
col2 NUMBER,
col3 NUMBER
);
CREATE INDEX t1_idx1
ON t1( col1 );
CREATE INDEX t1_idx2
ON t1( col2 );
然而,我对作者引用的“三倍因素”持怀疑态度。有很多变量没有被特定的经验法则捕捉到。记住添加索引会给插入操作带来潜在的大量成本是很有用的,但在权衡权衡以创建另一个索引时,衡量实际成本会更有用。
还有更多种类的索引吗?
至于你的最后一个问题——Oracle 有很多不同类型的索引(特别是如果我们将复合索引计为不同类型的索引)。该答案仅处理 b*-tree 索引,这是人们在引用没有限定符的“索引”时通常所说的意思。然而,Oracle 支持多种不同类型的索引——b*-tree 索引、位图索引、文本索引等。它创建 LOB 索引。它支持用户定义的可扩展索引。在每种类型的索引中,通常有几十种不同的选项。例如,您可以创建基于函数的 b*-tree 索引或位图连接索引,可以为 Oracle Text 索引指定自定义词法分析器,也可以为自己的自定义类型定义自己的索引结构。