Как просмотреть состояние всех индексов; включено/отключено в базе данных Oracle?

#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;
 

сделайте его видимым для общего использования.

Вопреки распространенному мнению, не только отсутствующий индекс, но и добавленный индекс могут испортить производительность.