#sql #oracle #indexing
Вопрос:
Кажется, я не могу найти способ запросить таблицу user_indexes для их статуса. Я предполагаю, что нет понятия индекса, который должен быть включен или отключен.
Ответ №1:
Похоже, ты недостаточно внимательно присмотрелся.
SQL> select index_name, status from user_indexes;
INDEX_NAME STATUS
------------------------------ --------
PK_EMP VALID
PK_DEPT VALID
<snip>
Что касается «отключенных» индексов — вообще говоря, вы не можете этого сделать:
SQL> alter index pk_dept disable;
alter index pk_dept disable
*
ERROR at line 1:
ORA-02243: invalid ALTER INDEX or ALTER MATERIALIZED VIEW option
Что вы можете сделать, так это сделать его непригодным для использования:
SQL> alter index pk_dept unusable;
Index altered.
SQL> select index_name, status from user_indexes;
INDEX_NAME STATUS
------------------------------ --------
PK_DEPT UNUSABLE
<snip>
Чтобы снова сделать его «пригодным для использования», вам нужно его перестроить:
SQL> alter index pk_dept rebuild;
Index altered.
SQL> select index_name, status from user_indexes;
INDEX_NAME STATUS
------------------------------ --------
PK_DEPT VALID
<snip>
Вообще говоря, вы можете отключить индекс на основе функций:
SQL> create index myind on emp (to_char(hiredate, 'yyyymm'));
Index created.
SQL> alter index myind disable;
Index altered.
SQL>
Ответ №2:
Вы не очень точны в своей формулировке, что вы подразумеваете под включением/отключением.
В любом случае, если вы хотите отключить или включить индекс от использования оптимизатором Oracle, используйте
alter index index_name invisible;
alter index index_name visible;
Это хорошая практика при добавлении нового индекса, чтобы сделать его невидимым, и только после тестирования в сеансе, который может его использовать
alter session set optimizer_use_invisible_indexes=true;
сделайте его видимым для общего использования.
Вопреки распространенному мнению, не только отсутствующий индекс, но и добавленный индекс могут испортить производительность.