В каких случаях Oracle будет создавать индексы автоматически? - PullRequest
20 голосов
/ 28 января 2010

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

Ответы [ 5 ]

24 голосов
/ 03 февраля 2010

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

  1. APC : для первичного ключа и уникального ключа, если такие индексы уже не существуют.
  2. APC : для хранилища больших объектов и типа XML.
  3. Гари : Для таблицы с вложенным столом.
  4. Джим Хадсон : для материализованного представления.
18 голосов
/ 28 января 2010

Во-первых, 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>

1012 * редактировать *

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

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 голосов
/ 28 января 2010

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

Также будет автоматически создан индекс при создании материализованного представления, поскольку Oracle должна иметь возможность быстро идентифицировать строки при быстром обновлении. Для материализованных представлений на основе rowid он использует 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
2 голосов
/ 29 января 2010

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

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

0 голосов
/ 28 января 2010

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

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