Понятие таблицы в памяти |
При кодировании бизнес-процессов приходится разрабатывать сложные алгоритмы, которые неоптимально ложатся в структуру реляционной БД. Подходы к решению проблем такого рода существуют в самих СУБД, что приводит порой к нарушению различных нормальных форм.
К таким мерам можно отнести:
создание индексов для ускорения времени выборки данных;
введение избыточности для хранения агрегированных данных;
введение избыточности для предотвращения лишних пересортировок.
Однако, как известно, эти меры помогают далеко не во всех случаях. К тому же они сопряжены с лишними накладными расходами и с ухудшением скоростных характеристик на некоторых режимах. Для обеспечения работы со сложными запросами к БД, в которые могут входить несколько таблиц, связанные реляционными связями, с разнообразными критериями усечения выборки и сортировки результирующего множества в SQL-серверах существует механизм курсоров. При этом SQL-сервер старается оптимизировать выборку данных в курсор (слепок данных). После этого, выборка данных из курсора осуществляется по уже подготовленным данным. В SQL-серверах существует также понятие view, что можно считать структурой, аналогичной курсорам, однако имеющим другой юридический статус.
В
существуют понятия логической таблицы, внешней выгрузки и временных таблиц. Логическая таблица представляет из себя совокупность таблиц, связанных или не связанных реляционными отношениями, ограничений (bounds и condition), полей и вычисляемых выражений. Таблицы, входящие в логическую, называются узлами реляционного графа.Внешняя выгрузка формируется в случае невозможности формирования выборки динамическим образом, например, необходимо упорядочить выборку по полям некорневой таблицы.
Для решения указанных задач вводятся понятия "таблица в памяти" и "индекс в памяти". Структура таблицы в памяти не может изменяться в процессе работы. Т.е. не допускается добавление или удаление таблиц и полей. Разрешается накладывать дополнительные фильтры и снимать их. Допускается менять порядок сортировки таблицы в памяти.
Использование таблиц в памяти позволит решить несколько задач:
ускорение формирования внешней выгрузки;
ускорение работы с временными таблицами, в том числе и с помеченными для выборки записями в Pick-ах;
ускорение формирования выборки данных за счет кэширования на клиенте;
ускорение обработки сложных структур данных за счет формирования "слепка" данных с последующим внедрением изменений в БД как "быстрой" транзакции;
повышения целостности данных за счет автоматического применения транзакций.
Имеются следующие уровни видимости таблиц в памяти на этапе выполнения программы:
глобальная таблица. Описывается вне интерфейса и без ключевого слова local. Откуда бы ни произошло обращение, будет создан один экземпляр таблицы в памяти. Глобальность подразумевается в рамках компонента, в котором описана ТП, т.к. видимость имен в принципе не распространяется за пределы компонента;
локальная таблица. Таблицы в памяти, включенные в описание интерфейса или имеющие ключевое слово local в описании. Для каждого интерфейса и, более того, для каждого экземпляра интерфейса при выполнении будет создан свой экземпляр таблицы.
Механизм закачки данных в таблицу в памяти возможен несколькими способами:
разовая закачка из драйвера БД, "слепок" данных;
закачка данных по мере надобности, кэш данных;
закачка данных из алгоритма, внешняя выгрузка, временные таблицы.
Независимо от способов закачки данных в таблицу в памяти, измененные данные могут либо быть выброшены, либо внедрены в БД, с применение транзакции или без.
Для полной совместимости с обработкой данных в БД, при обработке данных в памяти транзакции отрабатываются прозрачно. Это значит, что если идет смешанная обработка данных в транзакции, часть из которых размещена в памяти, а часть в БД и происходит откат транзакции, то данные востанавливаются к началу транзакции как в памяти, так и в БД. Соответственно, при успешном завершении транзакции изменения фиксируются как в БД, так и в памяти.
При таком подходе вызов функции flush внутри транзакции никак не влияет на транзакцию, просто транзакция в памяти и БД идут параллельно. Особенностью можно считать лишь то, что если есть обрамляющая транзакция, то использование флага mfTransation не приводит ни к каким действиям, так как в
транзакция может быть только одна.Более сложные реляционные структуры реализуются через логическую таблицу и совокупность таблиц в памяти.
Логическая таблица может использовать глобальные таблицы в памяти (с точки зрения конкретного клиента) как кэш каталогов, подключая одну и туже таблицу в памяти в разные логические таблицы.
Атлантис 5.00.04.