![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
Alexander06 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Здравствуйте.
Некоторые объемные операции над БД я выполняю с помощью plpgsql-функций с использованием курсоров (например, заполнение таблицы на основе нескольких имеющихся). При этом функция может выполняться десятки минут, а пользователь, работающий с клиентским приложением на Java/JDBC, не видит состояние ее выполнения. Перенос логики выполнения на клиентское приложение замедняет обработку и увеличивает траффик, чего не хочется. Есть ли возможность обмена данными с функцией plpgsql в процессе ее выполнения? Спасибо. |
|||
|
||||
v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: нет Всего: 56 |
ты можешь разбить длительную транзакцию на ряд коротких законченных транзакций и делать регулярные фиксации (коммиты).
Зафиксированные данные будут доступны пользователю. Главное не делать фиксации слишком регулярно , иначе это значительно замедлит производительность твоей системы. |
|||
|
||||
msr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.4.2009 Репутация: 1 Всего: 1 |
можно во время выполнения функции писать статус в какую-нибудь табличку, а из клиента по таймеру считывать из нее, либо использовать механизм асинхронного оповещения LISTEN/NOTIFY.
|
|||
|
||||
Alexander06 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Спасибо, за совет.
Это хорошая идея - так ведь можно и остановить функцию при необходимости. Встречный вопрос...когда я запускаю функцию plpgsql она загружает СУБД и та очень неохотно реагирует на другие запросы (например, pgAdmin попросту виснет выполняя запрос содержимого таблицы). Каким образом можно сбалансировать распределение ресурсов СУБД? |
|||
|
||||
msr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.4.2009 Репутация: 1 Всего: 1 |
постгрес устроен таким образом, что создает отдельный системный процесс для каждой клиентской сессии. Т.е. чтобы выполнять какие-то работы параллельно, нужно просто создать новую сессию(соединение). Есть правда вариант, что у вас слабый сервер и один этот процесс грузит его целиком.
pgAdmin виснет не от тяжкой работы, а в ожидании ответа от сервера. я б лучше подумал над оптимизацией самого запроса |
|||
|
||||
Alexander06 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Оптимизацией я занимаюсь, но создание полутора млн. записей за пару секунд пока не выходит.
Представьте себе, что у меня было в MySQL и H2 без встроенных процедурных языков ![]() Спасибо за ответы, я узнал все необходимое. |
|||
|
||||
msr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.4.2009 Репутация: 1 Всего: 1 |
для пакетной вставки записей можно использовать COPY - намного быстрее INSERT.
правда COPY работает с потоками вв и файлами. еще на время массовой вставки можно удалять индексы и отключать триггеры, потом делать ANALIZE |
|||
|
||||
Alexander06 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Спасибо за советы, буду разбираться в этом направлении.
|
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PostgreSQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |