создать индекс перед добавлением столбцов против создания индекса после добавления столбцов - имеет ли это значение? - PullRequest
2 голосов
/ 04 августа 2011

В Oracle 10g, имеет ли значение, в каком порядке создаются индекс создания и изменения таблицы?

Скажем, у меня есть запрос Q с предложением where для столбца C в таблице T. Теперь я выполняю одно из следующих действий:сценарии:

  1. Я создаю индекс I (C), а затем добавляю столбцы X, Y, Z.
  2. Добавляем столбцы X, Y, Z, а затем создаю индекс I (C).

Q - это "выбрать * из T, где C = что угодно"

Между 1 и 2 будет существенная разница в производительности Q в таблице T, когда T содержит очень большое числострок?

Лично я делаю практикой занятие №2, но у других, похоже, другое мнение.

спасибо

Ответы [ 2 ]

4 голосов
/ 04 августа 2011

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

В зависимости от параметров физической памяти таблицы, возможно, что добавление дополнительных столбцов и заполнение их данными может привести к значительному переносу строк. Эта миграция строк приведет к изменениям в индексах таблицы. Если индекс существует, когда вы заполняете три новых столбца данными, возможно, что заполнение данных в X, Y и Z займет немного больше времени из-за дополнительного обслуживания индекса.

1 голос
/ 05 августа 2011

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

Если новые столбцы будут заполняться как часть ALTER TABLE, это другой вопрос.

  1. База данных может подвергаться незапланированному отключению в ходе добавления этих данных в каждую строку данных таблицы
  2. В памяти сервера может не хватить места для записи каждой строки, измененной в этой таблице
  3. Следовательно, эти изменения строк могут быть записаны в файлы данных перед фиксацией и поэтому записаны как грязные блоки
  4. При следующем чтении этих блоков после успешного завершения таблицы ALTER будет выполнена отложенная очистка блока (т. Е. Запомнится тот факт, что изменение было зафиксировано)

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

Если сначала создать индекс, а затем добавить столбцы, создание индекса может быть быстрее, но отложенная очистка блока не произойдет, и эта служебная работа будет подхвачена приложением позже (возможно, select * from T where C = whatever)

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