Подтвердить что ты не робот

В каких случаях Oracle будет создавать индексы автоматически?

Насколько я знаю (эта страница) Oracle автоматически создает индекс для каждого объявления UNIQUE или PRIMARY KEY. Является ли это полным списком случаев, когда индексы создаются автоматически в Oracle?

4b9b3361

Ответ 1

Я попытаюсь объединить данные ответы и сделать это сообщество wiki.
Поэтому индексы автоматически создаются Oracle для таких случаев:

  • APC: для первичного ключа и уникального ключа, если такие индексы уже не существуют.
  • APC: для хранилища больших двоичных объектов и XMLType.
  • Gary: для таблицы с вложенной таблицей.
  • Джим Хадсон: для материализованного представления.

Ответ 2

Во-первых, Oracle не всегда создает индекс при создании первичного или уникального ключа. Если в этом столбце уже есть индекс, он будет использовать его вместо этого...

SQL> create table t23 (id number not null)
  2  /

Table created.

SQL> create index my_manual_idx on t23 ( id )
  2  /

Index created.

SQL> select index_name from user_indexes
  2  where table_name = 'T23'
  3  /

INDEX_NAME
------------------------------
MY_MANUAL_IDX

SQL> 

... отметим, что MY_MANUAL_IDX не является уникальным индексом; это не имеет значения...

SQL> alter table t23
  2      add constraint t23_pk primary key (id) using index
  3  /

Table altered.

SQL> select index_name from user_indexes
  2  where table_name = 'T23'
  3  /

INDEX_NAME
------------------------------
MY_MANUAL_IDX

SQL> drop index my_manual_idx
  2  /
drop index my_manual_idx
           *
ERROR at line 1:
ORA-02429: cannot drop index used for enforcement of unique/primary key


SQL> 

Есть еще один случай, когда Oracle автоматически создаст индекс: хранилище больших объектов....

SQL> alter table t23
  2      add txt clob
  3      lob (txt) store as basicfile t23_txt (tablespace users)
  4  /

Table altered.

SQL> select index_name from user_indexes
  2  where table_name = 'T23'
  3  /

INDEX_NAME
------------------------------
MY_MANUAL_IDX
SYS_IL0000556081C00002$$

SQL>

изменить

База данных обрабатывает XMLType так же, как другие LOB...

SQL> alter table t23
  2      add xmldoc xmltype
  3  /

Table altered.

SQL> select index_name from user_indexes
  2  where table_name = 'T23'
  3  /

INDEX_NAME
------------------------------
MY_MANUAL_IDX
SYS_IL0000556081C00002$$
SYS_IL0000556081C00004$$

SQL>    

Ответ 3

Нет, мы приближаемся, но пока не совсем полный список.

Также будет создан индекс, созданный при создании материализованного представления, поскольку Oracle должен иметь возможность быстро идентифицировать строки при быстром обновлении. Для материализованных представлений на основе строк используется I_SNAP $_tablename. Для материализованных представлений с первичным ключом он использует исходное имя PK, модифицированное по мере необходимости, чтобы сделать его уникальным.

create materialized view testmv 
refresh force with rowid
as select * from dual;

select index_name from user_indexes where table_name = 'TESTMV';

Index Name
--------------
I_SNAP$_TESTMV

Ответ 4

И еще один, если вы создаете таблицу со вложенной таблицей, вы автоматически создаете индекс. Хранилище на основе объектов в целом может сделать это, так как могут быть созданы скрытые таблицы.

Я думаю, что XMLTypes на основе схемы также будет делать это.

Ответ 5

Да, это полный список. Oracle автоматически создает индекс для каждого объявления UNIQUE или PRIMARY KEY.