2011-08-30 57 views
4

一般来说,表上的每个索引都会将INSERT插入表 减慢三倍;两个索引通常使插入两次,因为一个索引缓慢。 (然而,两部分单指数并不比单部分单指数差很多 )。两部分单指数是什么意思?

我从书上的Oracle 9i的性能优化技巧和技术由Richard Niemiec(奥斯本甲骨文新闻系列)得到这个。

是什么下列用语的含义:

  1. 两部分单项指标
  2. 单部分单项指标
  3. 是否有其他类型的指标?

回答

7

通过两部分索引,我假定Rich意味着一个复合索引,即构建在多个列上的索引。像这样:

create index t23_t_idx on t23 (col4, col2); 

虽然单个部件索引索引的单个列:

create index t23_s_idx on t23(col1); 

上面创建的索引是B树索引。 Oracle还有许多其他类型的索引。对于初学者来说,索引可以是唯一的,在这种情况下,索引只允许索引列中给定值的一个实例(或组合列的值的置换)。

也有位映射索引,这会对DML施加更高的性能损失,但会加快某些类型的查询速度;在数据仓库外部遇到位图索引是很少见的。

我们可以创建基于函数的索引,使我们能够索引确定性函数的结果(即保证为给定输入产生相同结果的索引)。这是我们如何在忽略时间元素的日期列上建立索引:

create index t23_fbi_idx on t23(trunc(col_34)); 

我们还可以在文本列上构建域索引。并且有分区表的特殊索引。

所有这些都在文档中有更详细的介绍。 Find out more

4

由于作者似乎没有实际定义过这个术语,我只能猜测他们的意思是两部分单索引是一个由两列组成的组合键,单部分单索引是基于一列。

5

我假设作者在谈到“两部分单一索引”时指的是复合索引。术语“组合索引”是一种更常用的方式来引用表的多个列上的索引。

如果您在两列上有单个复合索引,那么在插入过程中只需要维护一个索引结构,这样索引维护的开销与维护一个单列索引的开销并无太大区别。

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); 

我的索引维护大体量的两倍但是,作者引用的“三分之一”将是相当悲观的。有很多变数起作用,并不是由特定的经验法则捕捉到的。记住,添加索引会对插入操作带来潜在的巨大成本,但在衡量创建另一个索引时的权衡时衡量实际成本更加有用。

有没有更多类型的索引?

至于你的最后一个问题 - 甲骨文有很多不同类型的索引(特别是如果我们将复合索引计为不同类型的索引)。这个答案已经完全处理了b * -tree索引,这些索引是人们通常在没有限定词的情况下提到“索引”时的意思。但是,Oracle支持许多不同类型的索引 - b * - 树索引,位图索引,文本索引等。它创建LOB索引。它支持用户定义的可扩展索引。在每种类型的指数中,通常有几十种不同的选择。例如,您可以创建基于函数的b * -tree索引或位图连接索引,可以为Oracle Text索引指定自定义词法分析器,也可以为自己的自定义类型定义自己的索引结构。