Фактор кластеризации и уникальный ключ
Фактор кластеризации - Удивительное простое объяснение того, как оно рассчитывается:
По сути, CF рассчитывается путем выполнения полного сканирования индекса и просмотра строки в каждой записи индекса. Если ссылка на блок таблицы отличается от предыдущей записи индекса, CF увеличивается. Если ссылка на блок таблицы совпадает с предыдущей записью индекса, CF не увеличивается. Таким образом, CF дает представление о том, насколько упорядочены данные в таблице по отношению к элементам индекса (которые всегда сортируются и хранятся в порядке элементов индекса). Чем лучше (ниже) CF, тем эффективнее будет использовать индекс, так как для доступа к необходимым данным через индекс потребуется меньше блоков таблицы.
Статистика моего индекса:
Итак, вот мои индексы (индекс только по одному столбцу) в процессе анализа.
Начало индекса PK_
мой первичный ключ и UI
это уникальный ключ. (Конечно, оба имеют уникальные значения)
Query1:
SELECT index_name,
UNIQUENESS,
clustering_factor,
num_rows,
CEIL((clustering_factor/num_rows)*100) AS cluster_pct
FROM all_indexes
WHERE table_name='MYTABLE';
Результат:
INDEX_NAME UNIQUENES CLUSTERING_FACTOR NUM_ROWS CLUSTER_PCT
-------------------- --------- ----------------- ---------- -----------
PK_TEST UNIQUE 10009871 10453407 96 --> So High
UITEST01 UNIQUE 853733 10113211 9 --> Very Less
Мы видим, что PK имеет самый высокий CF, а другой уникальный индекс - нет.
Единственное логичное объяснение, которое меня поражает, это то, что данные под ним на самом деле хранятся в порядке столбцов по уникальному индексу.
1) Прав ли я с этим пониманием?
2) Есть ли способ дать PK, самый низкий CF
число?
3) Видя стоимость запроса с использованием обоих этих индексов, это очень быстро для одного выбора. Но все же номер CF - это то, что сбивает нас с толку.
Таблица является относительно большой по 10М записей, а также получает вставки / обновления в режиме реального времени.
Моя версия базы данных - Oracle 11gR2, поверх Exadata X2
1 ответ
Вы видите свидетельство таблицы кучи, проиндексированной упорядоченной древовидной структурой.
Чтобы получить чрезвычайно низкие числа CF, вам нужно упорядочить данные в соответствии с индексом. Если вы хотите сделать это (например, кластерные индексы SQL Server или Sybase), в Oracle у вас есть несколько вариантов:
- Просто создайте дополнительные индексы с дополнительными столбцами, которые могут удовлетворить ваши общие запросы. Oracle может возвращать набор результатов из индекса, не обращаясь к базовой таблице, если в индексе есть все необходимые столбцы. Если возможно, подумайте о добавлении столбцов в конце вашего ПК, чтобы обслужить ваш самый тяжелый запрос (практично, если у вашего запроса небольшое количество столбцов). Это обычно рекомендуется, если вы поменяете все ваши таблицы на IOT.
- Использовать IOT (организованная индексная таблица) - это таблица, хранящаяся в виде индекса, поэтому она упорядочена по первичному ключу.
- Сортированный хэш-кластер - более сложный, но может также принести выгоду при доступе к списку записей для определенного ключа (например, набор текстовых сообщений для данного номера телефона)
- Реорганизуйте свои данные и сохраните записи в таблице в порядке вашего индекса. Этот вариант подходит, если ваши данные не меняются, и вы просто хотите изменить порядок кучи, хотя вы не можете явно контролировать порядок; все, что вы можете сделать, это заказать запрос и позволить Oracle добавить его в новый сегмент.
Если большинство ваших шаблонов доступа являются случайными (OLTP), доступ к одной записи, я бы не беспокоился только о факторе кластеризации. Это просто показатель, который не является ни плохим, ни хорошим, он просто зависит от контекста и того, чего вы пытаетесь достичь.
Всегда помните, что проблемы Oracle не являются проблемами SQL Server, поэтому убедитесь, что любые изменения в дизайне оправданы измерением производительности. Oracle является высококонкурентным и не требует много конфликтов. Многоуровневый параллельный дизайн очень эффективен и отличается от других баз данных. Тем не менее, это все еще хорошая практика настройки для заказа данных для последовательного доступа, если это ваш общий случай использования.
Чтобы прочитать несколько лучших советов по этому вопросу, прочитайте Спросите Тома: что такое кластерные и некластеризованные индексы oracle