Что же происходит с индексами при разделении таблиц? Выбор за вами: можно оставить любой из индексов нетронутым (такие индексы будем называть глобальными (global index)) или же разбить его на части, соответствующие разделам таблицы локальные индексы, (local index)).
Что касается глобальных индексов, можно разбить их не так, как была разбита таблица. Если вы примете во внимание тот факт, что как древовидные (b-tree), так и растровые (bit-map) индексы могут использоваться одновременно, то поймете, что все может очень усложниться. Если к разделенной таблице применяется оператор SELECT, UPDATE или DELETE, то для поиска строк оптимизатор может воспользоваться различными способами:
- Использовать глобальный индекс (если таковой существует и его столбцы упомянуты в операторе SQL) для нахождения требуемых строк в одном или нескольких разделах.
- Просматривать локальный индекс для каждого раздела для определения того, содержит ли раздел искомые строки.
- Определить подмножество разделов, которые могут содержать искомые строки, а затем обратиться к локальным индексам этих разделов.
Хотя простейшим решением кажется использование глобального индекса, это может быть проблематично. Так как глобальные индексы распространяются на все разделы таблицы, на них неблагоприятно влияет текущая работа с разделами. Например, если раздел разбивается на несколько частей или два раздела сливаются в один, все глобальные индексы таблицы помечаются как непригодные для использования и, прежде чем их можно будет снова использовать, они должны быть перестроены.
Особенно неприятно, когда глобальные индексы применяются по умолчанию для первичных ключей разделенной таблицы. Используйте вместо глобальных индексов локальные. Для поддержания целостности разделенных таблиц можно применять механизм уникальных локальных индексов.