两部分单指数意味着什么?

时间:2011-08-30 16:28:56

标签: oracle indexing

  

通常,表上的每个索引都会将INSERT放慢到表中   三倍;两个索引通常使插入两次   作为一个指数缓慢。 (然而,一个由两部分组成的单一指数并不会更糟   而不是单一部分的单一指数。)

我从Richard Niemiec撰写的 Oracle 9i性能调优技巧和技巧一书中得到了这一点(Osborne Oracle Press Series)。

以下术语的含义是什么:

  1. 两部分单一索引
  2. 单件单一索引
  3. 还有更多种类的索引吗?

3 个答案:

答案 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的索引。单列。