我正在申请将插入约。将1500万条记录放入表中,然后构建索引。需要约。 30分钟创建索引(带索引优化提示,如NOLOGGING)。我可以选择插入按相同列排序的数据,稍后我将构建索引。
这样做会获得任何表现吗?
我是开发人员,而不是DBA,所以如果这是一个明显的答案,请原谅。
答案 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只会对(小得多)相关数据进行排序。
由于您使用的是多列,因此您可能需要查看索引压缩。根据您的数据和列顺序,它可以为初始构建节省大量时间和空间。