В чем разница между отключением и повторным включением индекса по сравнению с его удалением и повторным созданием?

Как говорится в вопросе, в чем разница между ними с точки зрения производительности и что лучше для каких сценариев?

Или эти два имеют тот же эффект? Каковы будут плюсы и минусы каждого из них, если он применим?

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

Как насчет отключения и повторного включения индекса? Он также автоматически собирает статистику?

Обратите внимание, что я спрашиваю об этом с мыслью о необходимости делать массовые пакетные вставки/обновления.

Огромное спасибо


person Avias    schedule 23.11.2013    source источник


Ответы (2)


Мы не можем отключить индекс, если только он не является индексом на основе функций.

SQL> alter index i42 disable;
alter index i42 disable
*
ERROR at line 1:
ORA-02243: invalid ALTER INDEX or ALTER MATERIALIZED VIEW option

SQL>

Мы можем сделать его непригодным для использования, но это имеет довольно неприятный побочный эффект:

SQL> alter index i42 unusable;

Index altered.

SQL> insert into t42 values (sysdate, 6, 'FOX IN SOCKS');
insert into t42 values (sysdate, 6, 'FOX IN SOCKS')
*
ERROR at line 1:
ORA-01502: index 'APC.I42' or partition of such index is in unusable state


SQL> 

Просто чтобы доказать точку зрения на индексы на основе функций:

SQL> create index f42 on t42(initcap(name))
  2  /

Index created.

SQL> alter index f42 disable;

Index altered.

SQL> insert into t42 values (sysdate, 6, 'MR KNOX')
  2  /
insert into t42 values (sysdate, 6, 'MR KNOX')
*
ERROR at line 1:
ORA-30554: function-based index APC.F42 is disabled


SQL> 

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


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

SQL> create unique index i42 on t42(id);

Index created.

SQL> alter table t42 add constraint t42_pk primary key (id);

Table altered.

SQL> insert into t42 values (sysdate, 5, 'MAISIE');

1 row created.

SQL> r
  1* insert into t42 values (sysdate, 5, 'MAISIE')
insert into t42 values (sysdate, 5)
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T42_PK) violated


SQL> alter table t42 drop constraint t42_pk;

Table altered.

SQL> insert into t42 values (sysdate, 5, 'MAISIE');
insert into t42 values (sysdate, 5, 'MAISIE')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.I42) violated


SQL> 
person APC    schedule 23.11.2013
comment
Этот досадный побочный эффект, который приводит к ORA-01502, вы наверняка получите в версии 9i и только в версиях от 10g до 12c, если это уникальный индекс, который стал непригодным для использования, или если значение по умолчанию (которое равно true) для skip_unusable_indexes параметр инициализации был изменен на false, или есть подсказка, которая заставляет использовать этот индекс. В противном случае это исключение не будет вызвано. - person Nick Krasnov; 23.11.2013

Когда вы отключаете/включаете индекс, вы говорите СУБД «не использовать этот индекс», но индекс все еще существует (как физический объект). Когда вы удаляете индексы, вы указываете СУБД удалить их, поэтому, когда вы изменяете свою таблицу с помощью индекса, все дерево индексов должно быть перестроено с самого начала (ну, это зависит от реализации). В любом случае, если вы отключите индекс для вставки и включите его, СУБД должна будет добавлять в индекс только вставленные значения. Если вы удалите и создадите индекс, СУБД запускается с нуля (более дорого)

person Antoniossss    schedule 23.11.2013
comment
Но с точки зрения производительности, имеет ли отключение индекса тот же эффект, что и полное отсутствие индекса при вставке данных? По сравнению с вставкой данных в таблицу, где индекс все еще присутствует и включен. - person Avias; 23.11.2013
comment
А как насчет заявлений об обновлении? В этом случае было бы лучше просто отключить/повторно включить индекс? - person Avias; 23.11.2013
comment
Ну, я думаю, что было бы проще проверить это самостоятельно. Создайте временную БД, вставьте миллион записей с отключенным индексом, позже вставьте те же данные без отключения индекса - замерьте время. Я говорю, что быстрее отключить и снова включить индекс, так как в таком сценарии индексная таблица обновляется за один прогон, а не обновляется после каждой вставки. - person Antoniossss; 23.11.2013
comment
Опять же, попробуйте сами. Я бы сказал, что отключение индексации происходит быстрее. - person Antoniossss; 23.11.2013
comment
Я не думаю, что отключение индекса делает то, что вы думаете. - person APC; 23.11.2013