从有序数据构建Oracle索引

从有序数据构建Oracle索引,oracle,indexing,Oracle,Indexing,我正在做的应用程序将插入约1500万条记录到一个表中,然后建立一个索引。创建索引大约需要30分钟(使用索引优化提示,如NOLOGGING)。我可以选择插入按相同列排序的数据,稍后我将构建索引 我这样做会有什么表现吗 我是开发人员,不是DBA,如果这是一个显而易见的答案,请原谅。如果您已经对数据进行了排序,那么在创建索引时,您可以告诉Oracle,它不需要使用NOSORT关键字再次对数据进行排序 CREATE INDEX index_name ON table_name (col1, col2)

我正在做的应用程序将插入约1500万条记录到一个表中,然后建立一个索引。创建索引大约需要30分钟(使用索引优化提示,如NOLOGGING)。我可以选择插入按相同列排序的数据,稍后我将构建索引

我这样做会有什么表现吗


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

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

CREATE INDEX index_name ON table_name (col1, col2) NOSORT;
SORT | NOSORT默认情况下,Oracle数据库按升序对索引进行排序 创建索引时的顺序。您可以指定NOSORT以指示要执行的操作 行已存储在中的数据库中的数据库 升序,这样Oracle数据库就不必对 创建索引时显示行。如果索引列的行或 列不按升序存储,则数据库返回 一个错误。为了最大限度地节省排序时间和空间,请使用此子句 在最初将行加载到表中之后。如果你 指定这两个关键字,然后默认为SORT


我也不是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子句中的任何更改都会加快有序数据的速度。

这样做可能不会获得任何总体性能

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

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


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

我不是在oracle中对数据进行排序。我的问题是,如果我按已排序的顺序输入记录,是否会获益。索引是否会构建得更快?但是有些系统不需要为排序付出代价吗?如果不是,那么你最好把它分类。对表数据进行排序还将减少聚类因子,这可能会使索引更易于使用。如果您正在使用,对表数据进行排序也有助于表压缩。