Является ли индекс кластеризованным или неклассифицированным в 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
Индексы Организованные таблицы должны быть организованы на первичном ключе. Если первичный ключ представляет собой генерируемое последовательность, это часто бесполезно или даже контрпродуктивно (потому что одновременные вставки попадают в конфликт для одного и того же блока).
Одногрупповые кластеры могут использоваться для группировки данных с тем же значением столбца в одном блоке (-ях) базы данных. Но они не упорядочены.