Перемещение таблиц
Со временем части базы данных будут расти или может измениться модель её использования. Когда это произойдёт администратор может внести дополнительные изменения в физическую структуру базы данных чтобы гарантировать продолжение её работы с максимальной эффективностью.
Для достижения этого создаётся отдельный структурный файл, который содержит описания только новых областей хранения. После чего новые области добавляются к физической структуре работающей базы данных с помощью утилиты PROSTRCT ADDONLINE, а затем существующие данные перемещаются в новые области.
Далее рассмотрены задачи, связанные с перемещением объектов базы данных (таблиц и индексов) в новые области хранения, а также описана задача перемещения BI-файлов на новый диск.
Перемещение таблиц с целью улучшения производительности может потребоваться в следующих случаях:
- таблица интенсивно используется и находится в одной области хранения с другими таблицами;
- диск, на котором размещена таблица не имеет свободного пространства, поэтому необходимо переместить таблицу на другой диск. Альтернативный способ решение этой проблемы, это добавить новый экстент в область хранения с размещением на другом диске;
- необходимо переместить интенсивно используемые таблицы на более быстрые диски.
Для перемещения таблицы и, при необходимости, связанных с ней индексов в новую область хранения в онлайн используется утилита PROUTIL TABLEMOVE.
Синтаксис:
proutil db-name -C tablemove table-name table-area idx-area
Утилита выполняет следующее:
- Получает на таблицу эксклюзивную локировку (EXCLUSIVE-LOCK).
- Перемещает таблицу и все её записи в новую область и строит новый первичный индекс.
- Строит все вторичные индексы таблицы:
- если утилите не была указана новая индексная область, то индексы строятся в текущей индексной области;
- если утилите указана новая индексная область, то все индексы перемещаются в новую область и затем перестраиваются.
- Удаляет таблицу из старой области хранения.
- Удаляет все старые индексы таблицы.
Предположим, что в базе sports таблица Order и все её индексы размещены в области хранения OrderData. Для улучшения производительности необходимо перемесить таблицу и её индексы в две новые области хранения.
Следующая команда PROUTIL TABLEMOVE выполнит перемещение таблицы Order в область OrderData2, а её индексы в область OrderIndex2:
proutil sports -C tablemove order OrderData2 OrderIndex2
Администратору следует принимать во внимание следующее влияние утилиты PROUTIL TABLEMOVE:
- Перемещение записей таблицы из одной области в другую аннулирует все ROWID и индексы таблицы. Поэтому утилита автоматически выполняет перестроение индексов независимо от того, перемещаются они или нет.
- Если индексная область не указана, то индексы таблицы не перемещаются.
- Старайтесь перемещать таблицу и связанные с ней индексы тогда, когда к ним не осуществляется доступ. Несмотря на то, что бизнес-приложение может читать записи из таблицы во время перемещения используя локировку NO-LOCK, конечный пользователь может получить неправильные результаты, так как операция перемещения выполняет множество изменений в индексах. При этом пользователи, которые используют локировку SHARE-LOCK будут блокироваться до завершения работы TABLEMOVE. Кроме того, поскольку утилита получает на таблицу локировку EXCLUSIVE-LOCK, то конечные пользователи не смогут обновлять данные в таблице.
Утилита PROUTIL TABLEMOVE спроектирована с возможностью полной отмены изменений, это означает, что СУБД OpenEdge обрабатывает всю операцию перемещения в одной транзакции (!). Как результат, изменения, сделанные утилитой TABLEMOVE, либо полностью будут приняты, если не было ошибок, либо отменены, если возникли ошибки. Таким образом, TABLEMOVE генерирует очень большое количество BI-заметок в одной транзакции, а, следовательно, BI-файл будет сильно расти. Поэтому утилита PROUTIL TABLEMOVE, как правило, применяется только для таблиц с небольшими размерами.
Если необходимо перемесить очень большие таблицы в новую область, то лучшим вариантом будет рассмотреть альтернативные методы перемещения, такие как текстовая или бинарная выгрузка и загрузка данных.
Также администратор может рассмотреть вариант использования табличного секционирования (Table Partitioning), с помощью которого можно перемещать отдельные секции в новые области онлайн. Для получения информации о механизме табличного секционирования в СУБД OpenEdge обратитесь к учебному пособию «OpenEdge Table Partitioning».