Является ли индекс кластеризованным или некластеризованным в Oracle?

#oracle #indexing

#Oracle #индексирование

Вопрос:

Как я могу определить, является ли индекс Oracle кластеризованным или некластеризованным?

Я выполнил

 select FIELD from TABLE where rownum <100
  

где FIELD находится поле, на основе которого строится индекс. Я упорядочил кортежи, но результат неверный, потому что индекс некластеризован.

Комментарии:

1. Без ORDER BY нет порядка. Вам нужно ВЫБРАТЬ * ИЗ (выбрать * из порядка таблицы по col_a), где число строк < 100

Ответ №1:

По умолчанию все индексы в Oracle некластеризованы. Единственными кластеризованными индексами в Oracle являются индексы первичного ключа, организованные по индексу таблиц (IOT).

Вы можете определить, является ли таблица IOT, просмотрев IOT_TYPE столбец в ALL_TABLES представлении (его первичный ключ может быть определен путем запроса представлений ALL_CONSTRAINTS и ALL_CONS_COLUMNS ).

Вот несколько причин, по которым ваш запрос может возвращать упорядоченные строки:

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

Случай 2 вернет отсортированные строки только случайно. Порядок вставок не гарантируется, более того, Oracle может повторно использовать старые блоки, если в будущем у некоторых из них окажется свободное место, что нарушит хрупкий порядок.

Случай 1 в большинстве случаев возвращает упорядоченные строки, однако вам не следует полагаться на это, поскольку порядок возвращаемых строк зависит от алгоритма пути доступа, который может измениться в будущем (или если вы измените параметр DB, особенно параллелизм).

В обоих случаях, если вам нужны упорядоченные строки, вы должны указать предложение ORDER BY:

 SELECT field 
  FROM (SELECT field 
          FROM TABLE 
         ORDER BY field) 
 WHERE rownum <= 100;
  

Ответ №2:

В Oracle нет понятия «кластеризованный индекс», как в SQL Server и Sybase. Существует таблица, организованная по индексу, которая похожа, но не то же самое.

Ответ №3:

«Кластеризованные» индексы, реализованные в Sybase, MS SQL Server и, возможно, других, где строки физически хранятся в порядке индексированных столбцов, как таковые в Oracle не существуют. «Кластер» имеет другое значение в Oracle, относящееся, я полагаю, к способу организации блоков и таблиц.

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

Самое близкое, что я могу получить к ответу на вопрос идентификации, — это попробовать что-то вроде этого:

 SELECT IOT_TYPE FROM user_tables
WHERE table_name = '<your table name>'
  

Мой экземпляр 10g сообщает соответственно IOT или null .

Ответ №4:

Таблицы, организованные по индексу, должны быть организованы по первичному ключу. Там, где первичным ключом является значение, сгенерированное последовательностью, это часто бесполезно или даже контрпродуктивно (поскольку одновременные вставки приводят к конфликту для одного и того же блока).

Кластеры отдельных таблиц могут использоваться для группировки данных с одинаковым значением столбца в одном блоке (блоках) базы данных. Но они не упорядочены.