通常,表上的每个索引都会将INSERT放慢到表中 三倍;两个索引通常使插入两次 作为一个指数缓慢。 (然而,一个由两部分组成的单一指数并不会更糟 而不是单一部分的单一指数。)
我从Richard Niemiec撰写的 Oracle 9i性能调优技巧和技巧一书中得到了这一点(Osborne Oracle Press Series)。
以下术语的含义是什么:
。
答案 0 :(得分:7)
通过两部分索引我假设Rich表示复合索引,即在多列上构建的索引。像这样:
create index t23_t_idx on t23 (col4, col2);
单个部分索引索引单个列:
create index t23_s_idx on t23(col1);
上面创建的索引是b-tree索引。 Oracle有许多其他类型的索引。对于初学者,索引可以是唯一的,在这种情况下,它们只允许索引列中给定值的一个实例(或复合列的值的排列)。
还有位映射索引,这会对DML造成更高的性能损失,但会加速某些类型的查询;很少遇到数据仓库之外的位图索引。
我们可以创建基于函数的索引,它允许我们索引确定性函数的结果(即保证为给定输入产生相同结果的函数)。这就是我们如何在日期列上构建一个忽略时间元素的索引:
create index t23_fbi_idx on t23( trunc(col_34));
我们还可以在文本列上构建域索引。并且有分区表的特殊索引。
所有这些都在文档中有更详细的介绍。 Find out more。
答案 1 :(得分:5)
我认为作者在谈到“两部分单一索引”时指的是综合索引。术语“复合索引”是一种更常用的方式来引用表的多列上的索引。
如果在两列上有单个复合索引,则在插入期间只需要维护一个索引结构,因此索引维护的开销与维护一个单列索引的开销没有太大差别。 / p>
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索引指定自定义词法分析器,也可以为自己的自定义类型定义自己的索引结构。
答案 2 :(得分:4)
由于作者似乎没有真正定义该术语,我只能猜测它们意味着两部分单个索引是由两列组成的复合键,而单部分单索引是基于a的索引。单列。