SELTA/cursorstriggers

Материал из Etersoft wiki
Перейти к навигацииПерейти к поиску

Принцип работы динамических курсоров 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**.


Настройка

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с имеются стандартные маски они создадутся при создании, инициализации, или обновлении бд.

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

Для добавления вручную вы можете выполнить следующие запросы:

INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('sc%', true, false);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('cj%', true, false);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sjourn', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('1stoper', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1soper', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1scorent', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sentry', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1saccs', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sconst', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('pg_%', false, false);

Приложение

  • Таблица 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


Аналогично этому можно создать маску для исключения группы таблиц из выборки.


Ссылки на сторонние дополнения