
Реорганизация больших таблиц в базах данных OpenEdge
В процессе администрирования баз данных периодически возникает необходимость реорганизации таблиц для предотвращения фрагментации данных. Реорганизация таблиц в режиме онлайн является эффективным методом при выполнении незначительных транзакций, что позволяет минимизировать воздействие на функционирующие приложения. Однако при работе с большими таблицами процесс реорганизации может характеризоваться следующими особенностями:
- Длительное время выполнения.
- Генерация значительного объема данных для восстановления, поскольку осуществляется полное сканирование и реорганизация всей таблицы.
- Потенциальное увеличение затрат на дисковое пространство.
- Возможное снижение эффективности процессов репликации OpenEdge или горячего резервирования.
Утилита PROUTIL TABLEREORG, представленная в выпуске OpenEdge 12.3 non-LTS, предоставляет возможность реорганизации фрагментированных данных записей без прерывания доступа к таблице для операций OLTP. Данный процесс заменяет трудоемкие операции дампа и загрузки, перестроение связанных индексов и пересоздание целевых баз данных репликации. Для успешного выполнения реорганизации все соответствующие требованиям записи должны быть размещены в одной и той же области хранения типа II. Утилита поддерживает работу с секционированными и мультитенантными таблицами.
В выпуске OpenEdge 12.8 LTS были внедрены две новые оптимизации для утилиты PROUTIL TABLEREORG:
- Опция restrict, позволяющая выполнять реорганизацию отдельных разделов таблицы, а не всей таблицы целиком. Администратор может указать начальную и, при необходимости, конечную позицию в таблице для управления диапазоном данных, подлежащих реорганизации. Для выполнения реорганизации всей таблицы параметр restrict не используется.
- Функция интеллектуального сканирования, оптимизирующая работу утилиты TABLEREORG путем использования индекса для идентификации и пропуска разделов данных, которые уже отсортированы в физическом порядке и не требуют реорганизации. Эта функция способствует улучшению масштабируемости процесса для очень больших таблиц. По умолчанию интеллектуальное сканирование активировано, однако его можно отключить с помощью новой опции nosmartscan или при запуске PROUTIL TABLEREORG с параметром resume.
Внедрение указанных оптимизаций позволяет ускорить процесс реорганизации таблиц, существенно сократить затраты на дисковое пространство и повысить оперативность выполнения задач администрирования баз данных.
Описание утилиты PROUTIL TABLEREORG
Утилита PROUTIL TABLEREORG предназначена для реорганизации таблицы в пределах её текущей области хранения посредством одной команды, обеспечивая непрерывную работу приложения.
Синтаксис утилиты:
proutil db-name -C tablereorg [owner-name.] table-name [ info ] | [ [ resume | resume-numrecs n | resume-rowid n] [ nosmartscan ] [ restrict [ EQ value ] | [ LT | LE high-value ] | [ GT | GE low-value [ AND LT | LE high-value ] ] ] [ useindex index-name ] [ recs n ] [ searchdepth n ] [ reusepercent n ] ] [ tenant tenant-name | group group-name | partition partition-name | composite initial ]
Описание параметров
db-name — параметр, определяющий имя базы данных, которая содержит таблицу, подлежащую реорганизации.
owner-name — параметр, указывающий владельца таблицы. Использование данного параметра обязательно, если имя таблицы не является уникальным в базе данных или если таблица не принадлежит владельцу PUB. По умолчанию владельцем всех таблиц, созданных и используемых ABL, является PUB.
table-name — параметр, задающий имя таблицы, которая подлежит реорганизации. Таблица должна находиться в области хранения типа II.
info — параметр, предназначенный для вывода информации о возобновлении работы таблицы после отмены операции PROUTIL TABLEREORG. В случае успешного возобновления работы выводится следующая информация:
- Идентификатор строки последней обработанной записи.
- Количество обработанных записей.
- Кластер области хранения типа II, где будут сохранены вновь реорганизованные записи после возобновления работы.
- Используемый индекс.
- Область хранения, в которой находилась таблица на момент последнего выполнения операции реорганизации.
- (При использовании опции -verbose) количество записей, обнаруженных в таблице.
Параметр info позволяет определить, на каком этапе была отменена операция реорганизации, и сколько данных еще предстоит обработать.
resume — параметр, инициирующий возобновление отмененной операции реорганизации таблицы в точке, где она была прервана. При этом интеллектуальное сканирование отключается. Возобновление происходит на основании информации, сохраненной во внутреннем хранилище, которая была предоставлена параметром info. Процесс реорганизации возобновляется после пропуска указанного количества записей или обнаружения сохраненного идентификатора строки. Если информация о возобновлении отсутствует или таблица была перемещена в другую область хранения после отмены предыдущей операции реорганизации, выводится сообщение об ошибке, и процесс реорганизации завершается. Информация о возобновлении обновляется после завершения обработки указанного количества записей.
resume-numrecs — параметр, позволяющий явно указать количество записей, которые должны быть пропущены при сканировании индекса, указанного параметром useindex, для возобновления отмененной операции реорганизации, независимо от сохраненной информации. Данный параметр можно использовать в сочетании с параметром resume-rowid. В случае использования обоих параметров точка возобновления определяется по тому, которая была достигнута первой.
resume-rowid — параметр, обеспечивающий возобновление отмененной операции реорганизации в точке, где указан идентификатор строки находится в индексе. Этот параметр можно использовать в сочетании с параметром resume-numrecs. В случае использования обоих параметров точка возобновления определяется по тому, которая была достигнута первой.
nosmartscan — параметр, отключающий интеллектуальное сканирование, как и опция resume. Таблица реорганизуется с самого начала. По умолчанию PROUTIL TABLEREORG выполняет интеллектуальное сканирование, пропуская обработку записей, которые уже упорядочены в соответствии с выбранным индексом. Интеллектуальное сканирование оптимизирует процесс реорганизации для очень больших таблиц.
restrict — параметр, оптимизирующий реорганизацию таблицы для больших объемов данных за счет обработки отдельных разделов таблицы, а не всей таблицы целиком. При отсутствии параметра restrict происходит реорганизация всей таблицы. Параметры, следующие за параметром restrict, задают диапазон сканирования для реорганизации. Эти параметры состоят из пары операторов и значений, формирующих поиск по индексу на основе первого поля компонента индекса, указанного с помощью параметра useindex. Оператор и значение определяют начальную и, возможно, конечную позицию сканирования. Параметр AND указывает конечную позицию (необязательно). Если конечная позиция не указана, таблица будет переформатирована от начальной позиции до конца в соответствии с указанным индексом. Допустимыми операторами для начальной позиции являются EQ, GT, GE, LT и LE. Для конечной позиции допустимыми операторами являются LT и LE. Значения данных, требующие пробелов, должны быть заключены в кавычки.
EQ — оператор, сканирующий только те части таблицы, значения которых точно соответствуют указанному значению. Оператор EQ является единственным допустимым для первого компонента индекса, имеющего логическое значение.
GT — оператор, сканирующий части таблицы, значения которых превышают указанное значение low-value.
GE — оператор, сканирующий части таблицы, значения которых больше или равны указанному значению low-value. Значение должно быть допустимым для типа данных поля индекса, указанного параметром useindex. Значения данных, требующие пробелов, должны быть заключены в кавычки.
low-value — значение, определяющее начальную позицию сканирования. Значение должно быть допустимым для типа данных поля индекса, указанного параметром useindex. Значения данных, требующие пробелов, должны быть заключены в кавычки.
LT — оператор, который может использоваться как с параметром AND, так и без него. Если используется параметр AND, начальная позиция реорганизации определяется оператором GT или GE. Если параметр AND не используется, все данные до верхнего значения преобразуются. Значение должно быть допустимым для типа данных поля индекса, указанного параметром useindex. Значения данных, требующие пробелов, должны быть заключены в кавычки.
LE — параметр, который может использоваться как с дополнительным параметром AND, так и без него. В случае использования AND, значение high-value определяет конечную точку процесса реорганизации. Если AND не используется, реорганизация осуществляется для всех данных, значения которых не превышают high-value. Значение high-value должно соответствовать типу данных поля индекса, указанному параметром useindex. Если в значении high-value присутствуют пробелы, оно должно быть заключено в кавычки.
AND — необязательный параметр, который позволяет использовать значение high-value в сочетании со значением low-value для параметров GT или GE.
high-value — необязательное значение, определяющее конечную позицию в процессе реорганизации. Это значение должно соответствовать типу данных поля индекса, указанному параметром useindex. Значения данных, требующие пробелов, должны быть заключены в кавычки..
useindex — параметр, задающий активный индекс, который будет использоваться для доступа к данным в таблице в процессе реорганизации. Индекс должен быть активным и не содержать слов. Если параметр useindex не указан, используется первичный индекс. Утилита PROUTIL TABLEREORG выполняет реорганизацию таблицы в соответствии с порядком сортировки указанного индекса. Для минимизации логического разброса при запросах данных из базы данных рекомендуется использовать индекс, который часто используется приложениями. Указание неуникального индекса может потребовать больше ресурсов и времени на выполнение реорганизации по сравнению с уникальным индексом.
recs — параметр, задающий количество записей, обрабатываемых в одной транзакции. Если этот параметр не указан, по умолчанию за транзакцию обрабатывается 100 записей.
tenant tenant-name — параметр, используемый для многопользовательских баз данных, который указывает на необходимость реорганизации раздела таблицы, принадлежащего конкретному арендатору. Если арендатор указан неверно или таблица не поддерживает многопользовательскую работу, утилита TABLEREORG завершает выполнение с ошибкой.
group group-name — параметр, применяемый для многопользовательских баз данных, который определяет необходимость реорганизации раздела таблицы, принадлежащего определенной группе. Если группа указана неверно или таблица не поддерживает многопользовательскую работу, утилита TABLEREORG завершает выполнение с ошибкой.
partition partition-name — параметр, используемый для баз данных с включенным секционированием таблиц, который указывает на необходимость реорганизации конкретного раздела с указанным именем. Если раздел не существует или таблица не является секционированной, утилита TABLEREORG завершает выполнение с ошибкой.
composite initial — параметр, применимый для баз данных с включенным секционированием таблиц, который указывает на необходимость реорганизации исходного составного раздела.
searchdepth — параметр, задающий процент свободной цепочки записей, который будет использоваться для поиска свободных блоков при реорганизации таблицы. Минимальное значение параметра — 0, максимальное — 100, а значение по умолчанию составляет 100.
Для изменения отображаемой информации можно использовать общие параметры базы данных, такие как -verbose, -lkwtmo и -rusage.
По умолчанию, если параметр -verbose не указан, утилита TABLEREORG сообщает о состоянии после обработки заданного количества записей (параметр recs) и фиксации соответствующей транзакции.
При использовании параметров -silent и -verbose утилита TABLEREORG предоставляет статистику завершения и информацию о количестве записей, найденных в таблице.
Примечания
- Использование команды PROUTIL TABLEREORG в системных таблицах запрещено. При попытке выполнить команду TABLEREORG для таблиц аудита, таких как _aud-audit-data и _aud-audit-data-value, или для таблиц CDC, таких как _Cdc-Change-Tracking, система OpenEdge возвращает ошибку следующего содержания: “Table Reorg operation not allowed on system tables“.
- При реорганизации таблицы изменяется rowid записей. Это может повлиять на приложения, которые используют данные в режиме просмотра или в виде списка результатов.
- Механизм интеллектуального сканирования и параметры возобновления могут быть не полностью точными для неуникальных индексов из-за порядка сортировки идентификаторов строк в каждой неуникальной записи.
- Во время интеллектуального сканирования, согласно индексу, первая неуникальная запись в серии неуникальных записей может не совпадать со следующей записью в текущем блоке записей. Это указывает на то, что найдена начальная точка реорганизации.
- При использовании команд resume, resume-numrecs или resume-rowid для неуникального индекса порядок дублированных ключей может изменяться между запусками. Это означает, что не гарантируется реорганизация всех дублированных записей.
- Если параметр resume не указан, отменённая реорганизация таблицы возобновится с первой записи, на которую имеется ссылка в соответствующем индексе.
- В случае конфликта блокировки записи во время реорганизации таблицы применяется параметр запуска -lkwtmo (время ожидания блокировки). Когда истекает время ожидания блокировки записи, текущие изменения фиксируются, и блокировка повторяется. Если возникает ещё один тайм-аут, операция пропускает эту запись, чтобы предотвратить взаимоблокировку при одновременном выполнении операций с одной и той же таблицей, использующих разный порядок записей. Для команды PROUTIL TABLEREORG значение параметра -lkwtmo по умолчанию составляет 10 секунд, однако указанное в командной строке значение переопределяет значение по умолчанию.
- В процессе реорганизации таблицы выводится информация о количестве найденных и обработанных записей: “Records found” и “Records processed”.
- При использовании параметра restrict необходимо убедиться в правильности типа данных для оператора. Значение должно соответствовать допустимому типу данных для первого поля компонента. При использовании оператора AND единственными допустимыми операторами для начальной позиции являются GT и GE.
Примеры
В первом примере выполняется реорганизация всей таблицы :
PROUTIL testdb -C TABLEREORG pub.mtabl1 Default info Table reorg of mtabl1 resume rowid: 84359, rec count: 1000 cluster: 81920 using index: idx_fint1_prim_u area: 10 (20045) Table reorganization operation info completed successfully. (20043)
Во втором примере реорганизуется конкретный раздел таблицы :
PROUTIL testdb -C TABLEREORG pub.abl1 nosmartscan restrict EQ 220430855876990168 useindex idx_2comp_win64 -verbose -rusage Records found: 25 (20200) Time to count 25 records: 0.000 (20197) Blocks on record free chain: 242 (20196) Time to scan 242 blocks on the record free chain: 0.008 (20195) Commit total - trans: 1, recs 24, last rowid: 9508, partition: 0 trid: 908 (20064) Resource usage: CPI user 0.002974 system 0.007870 Resource usage: DISK reads: 1720 KB at 33 MB/sec, writes: 28 KB at 1 MB/sec (17262) Elapsed time: 0.051 (20198) Total records processed: 25 (20060) Table reorganization operation info completed successfully. (20043)
В третьем примере осуществляется реорганизация определенного раздела таблицы . Ограничение данного раздела задается с помощью операторов GT и LT, которые определяют диапазон значений в соответствующих полях индекса:
PROUTIL testdb -C TABLEREORG pub.abl1 restrict GT 2935660178596213317 and LT 2204308585876990168 useindex idx_2comp_uint64 -verbose -rusage Records found: 25 (20200) Time to count 25 records: 0.000 (20197) Blocks on record free chain: 242 (20196) Time to scan 242 blocks on the record free chain: 0.008 (20195) Commit total - trans: 1, recs 24, last rowid: 9508, partition: 0 trid: 908 (20064) Start point identified - Split record and record size < max space per block. rowid: %j, rec size: %i bytes per block: %i rtc: %i Resource usage: CPI user 0.002974 system 0.007870 Resource usage: DISK reads: 1720 KB at 33 MB/sec, writes: 28 KB at 1 MB/sec (17262) Elapsed time: 0.051 (20198) Total records processed: 25 (20060) Table reorganization operation info completed successfully. (20043)
Заключение
Из этой статьи вы узнали об утилите PROUTIL TABLEREORG. Указанная утилита предназначена для реорганизации фрагментированных данных в таблицах без прекращения доступа для операций OLTP. В версии OpenEdge 12.8 LTS были внедрены две оптимизации, направленные на повышение эффективности работы утилиты:
- Опция restrict, позволяющая выполнять реорганизацию отдельных разделов таблицы.
- Функция интеллектуального сканирования, оптимизирующая процесс реорганизации и улучшающая его масштабируемость.
Эти усовершенствования способствуют ускорению процедуры реорганизации, снижению затрат на дисковое пространство и повышению общей эффективности администрирования баз данных.