среда, 18 мая 2016 г.

MUMPS: Функция $BIT

При использовании битовых индексов в MUMPS системах важным для понимания работы системы и ее применения является дополнительный к механизму битовых функций механизм конкурентного доступа, выполненный специально для них.

Битовый индекс представляет собой совокупность сегментов, каждый из которых это последовательность байт, и каждый бит в ней значим, может иметь значение либо "объект с идентификатором, равным номеру бита, существует" (1), либо "не существует" (0). Кроме того, применяется правило умолчания, что если бит находится за пределами реально физически существующих байт, либо строка байт вообще не существует, то логически для битовых операций это эквивалентно последовательности нулей.

В техническом отношении битовые операции могут быть добавлены к MUMPS системе внешними по отношению к ней функциями в динамической библиотеке. Автору довелось участвовать в проектах, где использовался именно такой вариант. Разработки блестяще работали в режиме OLAP и имели некоторые непреодолимые недочеты в режиме OLTP. Если операции с битами выполняются внешними по отношению к MUMPS системе средствами, то для записи в глобал остается использовать операцию set. Для MUMPS системы это операция полной перезаписи всего значения. Конечно, есть MUMPS системы в которых применяется дифференциальное журналирование, например как в MiniM, и в журнал записывается по возможности лишь изменение строки байт, а не вся строка, но в целом, вообще говоря, журналируется именно операция set.

В логическом отношении значимым изменением является изменение одного бита, а физически это для MUMPS системы целый большой полноценный set. Это приводит к двум проблемам:
  • Для простановки одного бита требуется взять полное значение сегмента, изменить в нем 1 бит и записать новое полное значение сегмента.
  • Для MUMPS системы видна лишь операция set.
Эти проблемы приводят к следующим последствиям: первая требует блокировать весь сегмент на время изменения, чтобы другой процесс не перезаписал значение сегмента ранее и его изменения не были утрачены. Поэтому возникает конфликт блокировок - хотя разным процессам требуется изменить разные биты, им необходимо использовать одно и то же имя блокировки. При высоконагруженной работе это приводит к увеличению вероятности взаимоблокировок. Вторая проблема приводит к большому объему журналирования, хотя из значимых изменений - всего один бит.

Эти две проблемы структурно не являются характерными для какой-либо определенной архитектуры или типа СУБД. В случае применения битовых индексов в любой другой системе они также существуют. Можно увидеть в рекомендациях, в том числе и для других типов СУБД, рекомендации использовать битовые индексы лишь для хранилищ данных, приближенных по своему режиму работы к режиму read-only, и рекомендации по возможности не использовать битовые индексы для задач класса OLTP.

В современных MUMPS системах, таких как Cache и MiniM, эти обе проблемы были решены на уровне СУБД введением двух дополнительных механизмов, работающих при использовании битовых функций:
  • При изменении бита система выполняет эту операцию атомарно, с внутренней синхронизацией, не попадающей в множество блокировок команды lock, и не удерживающейся до окончания транзакции.
  • При изменении бита система использует специальную запись в журнале.
В совокупности эти обе меры приводят к тому, что один единичный бит может быть проставлен независимо от других и при откате транзакции именно этот бит будет возвращен в предыдущее состояние, даже если другие процессы продолжают изменять битовую строку. Точно также значимые биты будут проставляться по отдельности при восстановлении из бекапа с дополнением по журналу.

Выполненные архитектурные меры по отношению к функции $bit снимают необходимость использовать блокировки индексных структур при перестроении битмап индексов, хотя в примерах в целях методологии они могут присутствовать.

Кроме того, при использовании битовых индексов в современных реализациях MUMPS систем также снимается рекомендация не использовать битмап индексы в OLTP задачах, а использовать по возможности только в OLAP задачах. В силу транзакционности таких битмап индексов они точно также применимы в любых OLTP задачах, как и индексы других типов. Это дает разработчикам свободу выбора при построении качественно других прикладных систем.

Точно так же, как и в случае с функцией $increment, разработчики должны разделить глобалы на те, к которым применяются операции $bit и те, к которым применяется прямое изменение другими формами команды set. В случае смешивания способов изменения байтовой строки MUMPS система будет журналировать именно использованную операцию вне зависимости от того, было ли изменение этой же строки иными способами.

Нужно отметить, что функции семейства $bit не являются частью стандарта MUMPS, соглашения принятые в одних системах, могут не поддерживаться в других. Этот функционал не входит в уровень переносимости. Кроме того, различные MUMPS системы могут использовать различные методы компрессии и кодирования битовых строк для уменьшения общего объема хранения. При переносе данных, таким образом, нельзя переносить битмап индексы как есть, их необходимо перестроить на целевой системе заново.

Подробнее о книге "MUMPS СУБД"

Комментариев нет:

Отправить комментарий