从有序数据构建Oracle索引

时间:2012-03-06 19:57:13

标签: oracle indexing

我正在申请将插入约。将1500万条记录放入表中,然后构建索引。需要约。 30分钟创建索引(带索引优化提示,如NOLOGGING)。我可以选择插入按相同列排序的数据,稍后我将构建索引。

这样做会获得任何表现吗?

我是开发人员,而不是DBA,所以如果这是一个明显的答案,请原谅。

3 个答案:

答案 0 :(得分:6)

如果您已经对数据进行了排序,那么在创建索引时,您可以告诉Oracle它不需要使用NOSORT关键字再次对数据进行排序。

CREATE INDEX index_name ON table_name (col1, col2) NOSORT;
  

排序| NOSORT默认情况下,Oracle数据库按升序对索引进行排序   在创建索引时进行排序。您可以指定NOSORT来指示   行已存储在数据库中的数据库   升序,以便Oracle数据库不必排序   创建索引时的行。如果索引列的行或   列不按升序存储,然后数据库返回   一个错误。为了最大程度地节省排序时间和空间,请使用此子句   在将行初始加载到表中之后立即执行。如果你   不指定这些关键字,那么SORT是默认值。

答案 1 :(得分:1)

我也不是DBA,但我很好奇并且做了测试(如果有人认为我的测试无效,请让我知道)。

我创建表

CREATE TABLE TEMP (
  ID_TEMP   NUMBER(10) NOT NULL,
  SOME_DATE  DATE NOT NULL,
  SOME_TEXT  VARCHAR2(60) NOT NULL,

  CONSTRAINT TEMP_PK primary key (ID_TEMP)

);

然后填充随机值

declare
  vdate date;
begin
  for idx in 0..10000000 loop
    vdate := sysdate - dbms_random.value(0,102548);
    insert into temp values(idx, vdate, 'something');
  end loop;
  commit;
end;

之后,索引:

create index TEMP_DATE_NDX ON TEMP (SOME_DATE) NOLOGGING; 
-- index TEMP_DATE_NDX created. Elapsed: 00:00:24.650

然后我垂下桌子并重新创建,但这次我按顺序插入记录:

DROP TABLE TEMP;
-- create table omitted...
declare
  vdate date;
begin
  for idx in 0..10000000 loop
    vdate := trunc(sysdate) + idx;
    insert into temp values(idx, vdate, 'something');
  end loop;
  commit;
end;

create index TEMP_DATE_NDX ON TEMP (SOME_DATE) NOLOGGING; 
-- index TEMP_DATE_NDX created. Elapsed: 00:00:01.993

如您所见,对于create index子句中的任何更改,有序数据更快。

答案 2 :(得分:0)

这样做可能无法获得任何整体表现。

排序表数据会比构建索引所花费的时间多。 (尽管如果要构建多个索引,情况可能会有所不同。)

对表进行排序需要与整个表的大小一样多的内存或临时表空间。我不确定索引构建的内部,但我猜想Oracle只会对(小得多)相关数据进行排序。

由于您使用的是多列,因此您可能需要查看索引压缩。根据您的数据和列顺序,它可以为初始构建节省大量时间和空间。