Построение индекса Oracle из упорядоченных данных - PullRequest
2 голосов
/ 06 марта 2012

Я делаю заявку, которая вставит ок.15 миллионов записей в таблицу, а затем построить индекс.Это займет ок.30 минут на создание индекса (с советами по оптимизации индекса, такими как NOLOGGING).У меня есть возможность вставить данные, отсортированные по тем же столбцам, которые я позже создам.

Получу ли я при этом какую-либо производительность?

Я - разработчик, а не администратор баз данных, поэтому извините, если это очевидный ответ.

Ответы [ 3 ]

6 голосов
/ 07 марта 2012

Если данные уже отсортированы, то при создании индекса вы можете сказать Oracle, что ему не нужно снова сортировать данные, используя ключевое слово NOSORT.

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

Сортировать |NOSORT По умолчанию Oracle Database сортирует индексы в порядке возрастания при создании индекса.Вы можете указать NOSORT, чтобы указать базе данных, что строки уже хранятся в базе данных в порядке возрастания, поэтому Oracle Database не нужно сортировать строки при создании индекса.Если строки индексированного столбца или столбцов не хранятся в порядке возрастания, база данных возвращает ошибку.Для большей экономии времени и пространства сортировки используйте это предложение сразу после начальной загрузки строк в таблицу.Если вы не укажете ни одно из этих ключевых слов, то по умолчанию будет использоваться SORT.

1 голос
/ 07 марта 2012

Я тоже не администратор баз данных, но мне было любопытно и я делаю тест (если кто-то считает, что мой тест недействителен, пожалуйста, дайте мне знать).

Я создаю таблицу

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

Как видите, при любых изменениях в предложении создания индекса упорядоченные данные выполнялись быстрее.

0 голосов
/ 07 марта 2012

Вы, вероятно, не достигнете общей производительности при этом.

Вы потратите больше времени на сортировку данных таблицы, чем на построение индекса. (Хотя все может быть иначе, если вы создаете несколько индексов.)

Для сортировки таблицы требуется столько памяти или временного табличного пространства, сколько размер всей таблицы. Я не уверен насчет внутренних возможностей построения индекса, но я предполагаю, что Oracle сортирует только (намного меньшие) релевантные данные.

Поскольку вы используете несколько столбцов, возможно, вы захотите посмотреть на сжатие индекса. В зависимости от ваших данных и порядка столбцов, вы можете сэкономить много времени и места при первоначальной сборке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...