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

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

Я сделал

select FIELD from TABLE where rownum <100

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

Ответ 1

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

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

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

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

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

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

В обоих случаях, если вы хотите упорядоченные строки, вы должны предоставить предложение 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. "Cluster" имеет другое значение в Oracle, связанное, я полагаю, с тем, как организованы блоки и таблицы.

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

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

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

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

Ответ 4

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

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