本地索引和本地索引与分区关键字的Oracle差异

时间:2018-03-26 09:38:49

标签: oracle indexing database-partitioning

我找到了关于Oracle中不同权限的this教程。 我想知道,如果有人能解释这三个创建索引语句之间的差异:

CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL;

CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL
 (PARTITION invoices_q1 TABLESPACE users,
  PARTITION invoices_q2 TABLESPACE users,
  PARTITION invoices_q3 TABLESPACE users,
  PARTITION invoices_q4 TABLESPACE users);

CREATE TABLE invoices
(invoice_no    NUMBER NOT NULL,
 invoice_date  DATE   NOT NULL,
 comments      VARCHAR2(500))
PARTITION BY RANGE (invoice_date)
(PARTITION invoices_q1 VALUES LESS THAN (TO_DATE('01/04/2001', 'DD/MM/YYYY')) TABLESPACE users,
 PARTITION invoices_q2 VALUES LESS THAN (TO_DATE('01/07/2001', 'DD/MM/YYYY')) TABLESPACE users,
 PARTITION invoices_q3 VALUES LESS THAN (TO_DATE('01/09/2001', 'DD/MM/YYYY')) TABLESPACE users,
 PARTITION invoices_q4 VALUES LESS THAN (TO_DATE('01/01/2002', 'DD/MM/YYYY')) TABLESPACE users);

我原以为,每个分区都创建相同类型的本地索引。

//编辑: 另一个问题。 我们假设我有下表

CREATE INDEX invoices_idx ON invoices (invoice_date);

我创建了一个索引:

extension Date
{
   var nextDateWeak : Date {
       return Calendar.current.date(byAdding: .day, value: 6 , to: self )!
   }
}

如果我同时查询索引,那将是什么类型的索引以及我需要什么类型的索引invoice_no only?

感谢您的澄清。 即

2 个答案:

答案 0 :(得分:2)

CREATE INDEX invoices_idx ON invoices (invoice_date);

您正在创建全局索引。文档说,"全局索引可以通过范围或哈希方法进行分区,并且可以在任何类型的分区或非分区的表中定义"。

CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL;

您正在创建本地索引。本地索引是索引分区和表分区之间的一对一映射。

CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL
 (PARTITION invoices_q1 TABLESPACE users,
  PARTITION invoices_q2 TABLESPACE users,
  PARTITION invoices_q3 TABLESPACE users,
  PARTITION invoices_q4 TABLESPACE users);

您正在创建本地分区索引。本地分区索引允许我们将表的各个分区和索引脱机以进行维护(或重组),而不会影响表中的其他分区和索引。

答案 1 :(得分:2)

如果您创建索引LOCAL,那么每个分区都有其自己的"指数。否则你会有一个"一个大指数"跨越整个表,称为GLOBAL索引。

甚至还有第三种选择,您也可以对索引进行分区。 LOCAL表示索引分区与基表相同。但是,可以将索引分区不同于表格 - 但我不得不承认,我不知道任何有用的用例。

通常LOCAL索引更好,因为

  • 与一个大索引
  • 相比,索引分区更小(因此更快)
  • 删除/截断分区时索引不会失效
  • 您只能在某些分区上构建索引,而不是整个表。

但当然也有缺点

  • 如果您需要UNIQUE索引并且分区键列不是索引的一部分,则它必须是全局索引
  • 如果您有许多分区且查询未指定分区,那么LOCAL索引可能会更慢,因为扫描许多本地索引分区就像扫描许多不同的索引一样。