Подтвердить что ты не робот

Позволяют ли какие-либо базы данных одновременно создавать несколько индексов в одной таблице?

Я уверен, что этого не может быть сделано в Oracle, но я бы хотел, чтобы вас не доказали...

Скажем, у меня огромная таблица с большим количеством столбцов, и я хочу создать индексы на дюжине или около того столбцов. Используя Oracle, я бы отпустил несколько последовательных операторов create index и ушел и кипятил чайник.

Каждый create index должен сканировать каждую строку таблицы, чтобы сформировать индекс.

то есть. 10 индексов = 10 полных сканирований.

Вы думаете, что очевидная оптимизация будет состоять в том, чтобы сканировать таблицу один раз и одновременно индексировать 10 столбцов. Не так ли?

create indexes on mytable (
    ix_mytable_cola (cola),
    ix_mytable_colb (colb),
    ix_mytable_colc (colc)
);

Так очевидно, что должна быть веская причина, почему это не так.

Любые идеи?

Я мог бы отключить каждый create index одновременно в отдельных сеансах и надеяться, что кэш буфера базы данных сохранил день, но кажется длинным.

ИЗМЕНИТЬ

Я не получил окончательного ответа, поэтому я задал тот же вопрос в Oracle-L:

http://www.freelists.org/post/oracle-l/Creating-multiple-indexes

Общий консенсус заключался в том, что он недоступен, но, возможно, будет полезной функцией. Самый полезный ответ был от Дэвида Олдриджа, который предположил, что если бы все индексы создания создавались одновременно, тогда Oracle "поступил бы правильно".

4b9b3361

Ответ 1

Ответ для Oracle отсутствует, и согласно моим исследованиям это также не для DB2. Я сомневаюсь, что у других есть эта функция.

Ответ 2

Я не думаю, что это возможно в Oracle или любой другой СУБД. Однако в Oracle вы можете ускорить создание индекса с помощью таких параметров, как PARALLEL и NOLOGGING.

PARALLEL позволяет распараллеливать обработку на N других CPUS.

NOLOGGING не пишет запись в журнал повтора (это может быть не для вас).

CREATE INDEX some_idx
   ON a_table(col1, col2, col3)
PARALLEL 3
NOLOGGING;

Ответ 3

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

Когда строки таблицы физически сортируются в том же порядке, что и индекс, который вы строите, вы можете указать опцию "NOSORT" в своем заявлении об индексе создания. Таким образом, Oracle не должен сортировать строки во время создания индекса (который является убийцей, когда сортировка разливается на диск).

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