SELTA/cursorstriggers
Принцип работы динамических курсоров SELTA.
: описывается принцип работы SELTA начиная с версии 1.0.6
Данный материал поможет Вам в тонкой настройки ваших БД, работающих через SELTA, тем самым улучшив скорость их работы.
Принцип работы
В настоящий момент в связи с отсутствием динамических курсоров в PostgreSQL в SELTA имитируется их работа в odbc драйвере.
При каждом вызове метода SQLFetch для динамического курсора в ODBC драйвере проверяется наличие изменений в таблице(или нескольких) на основе которой был создан курсор. Обновления курсора происходит, только если в таблице произошли изменения.
За фиксирование изменений в таблицах, отвечает таблица pg_table_changes*, содержащая в себе имя таблиц и количество изменений.
Изменения в таблицу pg_table_changes добавляют триггеры, имеющиеся у таблиц, созданных SELTA.
замечание:
изменения не всех таблиц фиксируются в pg_table_changes, соответственно, не у всех таблиц есть триггеры. Если обновляется динамический курсор, основанный на таблице, изменения в которой не фиксируются, курсор пересоздается.
Почему надо настраивать
В связи с тем, что наличие у таблицы триггера, замедляет работу с таблицей(изменения данных) целесообразно использовать триггеры не у всех таблиц.
Создастся или не создастся триггер на таблицу и соответствующая запись в pg_table_changes, зависит от того, соответствует ли имя таблицы маскам, хранящимся в таблице pg_trigger_table_mask**.
Настройка##LINKTOFTN ftnd1##
1. Сделайте список таблиц, для которых нужно делать триггеры. Нужно делать триггеры для таблиц, для которых часто создаются и обновляются динамические курсоры, и редко меняется информация ( например справочники). И не нужно делать триггеры, если динамические курсоры не создаются и не обновляются(или это происходит редко).
2. Заполните на основе этого списка таблицу pg_trigger_table_mask.
3. Запустите функцию pg_create_delete_trigger_from_mask() ("SELECT pg_create_delete_trigger_from_mask()"), будут созданы нужные триггеры на таблицы, ненужные удалены, записи в таблице pg_table_changes обновятся, в соответствии с таблицей pg_trigger_table_mask,
Эти действия можно проделывать неограниченное число раз.
1с
Для таблиц 1с имеются стандартные маски они создадутся при создании, инициализации, или обновлении бд.
mask |
include |
equal |
sc% |
t |
f |
cj% |
t |
f |
_1sjourn |
t |
t |
1stoper |
t |
t |
_1soper |
t |
t |
_1scorent |
t |
t |
_1sentry |
t |
t |
_1saccs |
t |
t |
pg_% |
f |
f |
Приложение:
- Таблица pg_table_changes
- tabname Имя таблицы
- numberchanges Количество изменений
Таблица создается и модифицируется с помощью триггеров и функций, правка вручную не требуется.
- Таблица pg_trigger_table_mask
- mask маска
- include Входит в выборку (true делать для таблицы с такой маской триггер и запись в pg_table_changes, false -- не деклать)
- equal Соответствие (true - точное('='), false не точное ('LIKE'))
Заполните поле mask, include, equal в соответствии с тем, какие триггеры нужны для БД, а какие нет.
Для создания триггера для таблицы с именем table1, требуется написать имя таблицы в поле mask, указать, что ее следует включать в выборку -- в поле include = true, и точное соответствие equal = true
mask |
include |
equal |
table1 |
true |
true |
Для НЕ создания триггера для таблицы с именем table2, требуется написать имя таблицы в поле mask, указать, что ее НЕ следут включать в выборку -- в поле include = false, и точное соответствие equal = true
mask |
include |
equal |
table2 |
false |
true |
Для создания триггера для всех таблиц с именами начинающимеся с tb, дожны написать имя маску в поле mask ('tb%'), указать, что ее следут включать в выборку -- в поле include = true, и неточное соответствие equal = false
mask |
include |
equal |
tb% |
true |
false |
Аналогично этому можно создать маску для исключения группы таблиц из выборки.
Ссылки на сторонние дополнения:
- FTN ftnd1##http://infostart.ru/projects/3801/ Дополнение для удобной настройки триггеров от Djelf.