|
Программирование >> Oracle
Фрагментация 1139 было эффективно управлять. Можно разделить данные по диапазону, а затем разбить каждый фрагмент на несколько подфрагментов по хеш-функции. Это позволит распределить операции ввода-вывода по нескольким дискам для каждого большого фрагмента. Кроме того, теперь можно пропускать фрагменты на трех уровнях. Если запрос выполняется по ключу, использованному при фрагментации по диапазону, сервер может пропустить все фрагменты, не отвечающие критериям запроса. Если в запросе будет указан еще и ключ хеширования, сервер сможет пропустить другие подфрагменты в соответствующем диапазоне. Если в запросе используется только ключ хеш-функции (а ключ, по которому выполнена фрагментация по диапазону, не используется), сервер будет обращаться только к соответствующим подфрагментам в каждом диапазоне. Рекомендуется преимущественно использовать фрагментацию по диапазону, если данн1е вообще имеет смысл разбивать на диапазоны по каким-то атрибутам. Фрагментация по хеш-функции имеет множество преимуществ, но она не так эффективна с точки зрения возможностей игнорирования фрагментов. Использовать хеш-фрагментацию в пределах фрагментов по диапазону рекомендуется, когда соответствующие диапазонам фрагменты слишком велики для эффективного управления, или в тех случаях, когда желательно распараллеливать операторы ЯМД или иметь возможность параллельного просмотра индексов для отдельного фрагмента. Фрагментация индексов Индексы, как и таблицы, можно фрагментировать. Существует два способа фрагментации индексов. Можно фрагментировать индекс по тем же критериям, что и базовую таблицу. Такие индексы называют локально фрагментированными. Для каждого фрагмента таблицы будет создан соответствующий фрагмент индекса, индексирующий только этот фрагмент таблицы. Все записи в данном фрагменте индекса ссылаются на один фрагмент таблицы, а все строки фрагмента таблицы представлены в одном фрагменте индекса. Можно фрагментировать индекс по диапазону. Такие индексы называют глобально фрагментированными. Индекс фрагментируется по диапазону, и один фрагмент индекса может сс1латься на любые (хоть все) фрагменты базовой таблицы. Следующие схемы показывают различие между локально и глобально фрагментиро-ванными индексами.
::локально фрагментированный индекс фрагмент индекса А фрагмент; индекса В
глобально фрагментированный индекс 1140 Глава 14 Следует помнить, что количество фрагментов глобально фрагментированного индекса может не совпадать с количеством фрагментов таблицы. Поскольку глобально фрагментированные индексы можно фрагментировать только по диапазону, при разбиении индекса по хеш-функции или в случае составной фрагментации придется использовать локально фрагментированные индексы. Локально фраг-ментированный индекс использует такую же схему фрагментации, как и базовая таблица. Локально фрагментированные индексы Практика показывает, что чаше всего используются локально фрагментированные индексы. Дело в том, что фрагментация, как правило, используется в среде хранилищ данных. В системах ООТ более типичны глобально фрагментированные индексы. Локально фрагментированные индексы наиболее подходят для хранилищ данных. Они обеспечивают большую доступность данных (меньшее время простоя), поскольку проблемы доступности, скорее всего, будут связаны с одним диапазоном или хеш-фрагментом данных. Вследствие того что глобально фрагментированный индекс ссылается на несколько фрагментов, для определенных запросов фрагменты могут стать недоступными. Локально фрагментированные индексы обеспечивают большую гибкость при сопровождении фрагментов. Если администратор базы данных решит перенести фрагмент таблицы, изменять придется только соответствующий фрагмент локально фрагментиро-ванного индекса. Если индекс фрагментирован глобально, изменять придется все его фрагменты. То же самое и в случае смещающегося окна данных, когда старые данные удаляются, а новые - добавляются в таблицу в виде отдельного фрагмента. При этом нет необходимости изменять локально фрагментированные индексы, а вот все глобально фрагментированные придется изменить. В некоторых случаях сервер Oracle может учитывать факт локальной фрагментации индекса аналогично таблице, и вырабатывать на основе этого факта оптимальные планы выполнения запросов. При использовании глобально фрагментированных индексов такой взаимосвязи фрагментов индекса и таблицы нет. Локальные индексы также помогают при восстановлении состояния фрагмента на определенный момент времени. Если необходимо восстановить состояние одного фрагмента на более ранний момент времени, чем всю остальную таблицу, все локально фрагментированные индексы можно восстановить на этот же момент. Все глобально фрагментированные индексы для такого объекта придется пересоздавать. Выделяется два типа локально фрагментированных индексов. Локально фрагмегированн1е индексы с префиксом. Это индексы, в которых 1ю- чи фрагментации являются начальными ключами индекса. Например, если таблица фрагментирована по диапазону значений столбца TIMESTAMP, в списке столбцов ключа локально фрагментированного индекса с префиксом по этой таблице столбец TIMESTAMP будет первым. Локально фрагмерованн1е индексы без префикса. Это индексы, в которгх 1ю- чи фрагментации не являются начальными ключами индекса. Такой индекс может содержать или не содержать столбцы ключа фрагментации. Фрагментация 1141 Оба типа индексов обеспечивают игнорирование фрагмента, оба могут поддерживать уникальность (если индекс без префикса включает ключ фрагментации) и т.д. Запрос, использующий локально фрагментированный индекс с префиксом, всегда позволяет пропускать фрагмент, а запрос, использующий локально фрагментированный индекс без префикса, может и не позволить это сделать. Вот почему утверждается, что локально фрагментированные индексы без префикса медленнее ; они не гарантируют игнорирование фрагментов (хотя его и поддерживают). Кроме того, как будет продемонстрировано ниже, при выполнении некоторых операций оптимизатор будет обрабатывать локально фрагментированные индексы без префикса не так, как индексы с префиксом. В документации Oracle подчеркивается, что: локально фрагментированные индексы с префиксом обеспечивают более высокую производительность, чем индексы без префикса, потому что уменьшают количество проверяемых оптимизатором индексов Понимать это надо так: локально фрагментированные индексы обеспечивают более высокую производительность для. ЗАПРОСОВ, сс1лающихся на весь входящий в них ключ фрагментации, по сравнению с ЗАПРОСАМИ, не ссылающимися на ключ фрагментации Локально фрагментированные индексы с префиксом, использующиеся для начального доступа к таблице в запросе, не имеют существенных преимуществ по сравнению с индексами без префикса. Я имею в виду, что, если выполнение запроса может начаться с просмотра индекса (SCAN AN INDEX), особой разницы между индексами с префиксом и без префикса нет. Позже, когда будет рассматриваться использование фрагментиро-ванных индексов в соединениях, вы увидите разницу между индексами с префиксом и без префикса. Для запроса, выполнение которого начинается с доступа по индексу, все зависит от условия, использованного в запросе. Продемонстрирую это на маленьком примере. Создадим таблицу PARTITIONED TABLE и локально фрагментированный индекс с префиксом LOCAL PREFIXED по ней. Кроме того, добавим локально фрагментирован-н1й индекс без префикса LOCAL NONPREFIXED: tkyte@TKYTE816> CREATE TABLE partitioned table 2 (a int, 3 b int 5 PARTITION BY RANGE (a) 7 PARTITION part l VALUES LESS THAN(2) , 8 PARTITION part 2 VALUES LESS THAN(3) 10 / Table created. tkyte@TKYTE816> create index local prefixed on partitioned table (a,b) local; Index created.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |