Является ли индекс кластеризованным или некластеризованным в Oracle? - PullRequest
10 голосов
/ 09 июня 2011

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

Я сделал

select FIELD from TABLE where rownum <100

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

Ответы [ 4 ]

10 голосов
/ 09 июня 2011

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

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

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

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

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

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

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

SELECT field 
  FROM (SELECT field 
          FROM TABLE 
         ORDER BY field) 
 WHERE rownum <= 100;
7 голосов
/ 09 июня 2011

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

5 голосов
/ 09 июня 2011

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

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

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

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

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

2 голосов
/ 09 июня 2011

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

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

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