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

Я почти уверен, что это невозможно сделать в 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 одновременно в отдельных сеансахи надеюсь, что буферный кеш базы данных сохранил день, но, похоже, слишком долго.

EDIT

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

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

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

Ответы [ 4 ]

5 голосов
/ 15 ноября 2010

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

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

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

CREATE INDEX some_idx
   ON a_table(col1, col2, col3)
PARALLEL 3
NOLOGGING;
1 голос
/ 15 ноября 2010

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

0 голосов
/ 13 декабря 2010

Заметил это сообщение в блоге Дэвид Олдридж с марта 2008 года ...

http://oraclesponge.wordpress.com/2008/03/26/how-to-create-multiple-indexes-in-a-single-ddl-statement/

0 голосов
/ 15 ноября 2010

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

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

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

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