#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
).
Вот несколько причин, по которым ваш запрос может возвращать упорядоченные строки:
- Ваша таблица организована по индексу и
FIELD
является ведущей частью ее первичного ключа. - Ваша таблица организована по принципу кучи, но строки случайно упорядочены по
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:
Таблицы, организованные по индексу, должны быть организованы по первичному ключу. Там, где первичным ключом является значение, сгенерированное последовательностью, это часто бесполезно или даже контрпродуктивно (поскольку одновременные вставки приводят к конфликту для одного и того же блока).
Кластеры отдельных таблиц могут использоваться для группировки данных с одинаковым значением столбца в одном блоке (блоках) базы данных. Но они не упорядочены.