从有序数据构建Oracle索引
我正在做的应用程序将插入约1500万条记录到一个表中,然后建立一个索引。创建索引大约需要30分钟(使用索引优化提示,如NOLOGGING)。我可以选择插入按相同列排序的数据,稍后我将构建索引 我这样做会有什么表现吗从有序数据构建Oracle索引,oracle,indexing,Oracle,Indexing,我正在做的应用程序将插入约1500万条记录到一个表中,然后建立一个索引。创建索引大约需要30分钟(使用索引优化提示,如NOLOGGING)。我可以选择插入按相同列排序的数据,稍后我将构建索引 我这样做会有什么表现吗 我是开发人员,不是DBA,如果这是一个显而易见的答案,请原谅。如果您已经对数据进行了排序,那么在创建索引时,您可以告诉Oracle,它不需要使用NOSORT关键字再次对数据进行排序 CREATE INDEX index_name ON table_name (col1, col2)
我是开发人员,不是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中对数据进行排序。我的问题是,如果我按已排序的顺序输入记录,是否会获益。索引是否会构建得更快?但是有些系统不需要为排序付出代价吗?如果不是,那么你最好把它分类。对表数据进行排序还将减少聚类因子,这可能会使索引更易于使用。如果您正在使用,对表数据进行排序也有助于表压缩。