powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Беда
8 сообщений из 8, страница 1 из 1
Беда
    #39326555
kotahinus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Есть такой незатейливый запрос запрос:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE FUNCTION some_function(max_date date, min_date date) RETURNS int AS
$BODY$
BEGIN
RETURN (
SELECT
COUNT(DISTINCT col)
FROM stat
WHERE
create_date BETWEEN min_date AND max_date
);
END;
$BODY$
LANGUAGE plpgsql;



При запуске на сервере на котором собственно находиться таблица, результат приходит почти мгновенно. Когда же я запускаю тот же самый запрос с другого сервера к которому данная таблица подключена как внешняя, сканирование может затягиваться минут на 10, а то и вовсе повесит компьютер, причем это касается только запроса с переменными.
Если писать даты в битвин на прямую

Код: plsql
1.
create_date BETWEEN '2016-04-02 00:00:00' AND '2016-04-03 00:00:00'



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

С чем может быть связанна такая громадная разница во времени выполнения? Была ли уже у кого-нибудь похожая проблема?
...
Рейтинг: 0 / 0
Беда
    #39326630
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kotahinus,

какая версия pg? FDW мог захотеть вычитать данные с удалённой машины на локальную и пофильтровать локально. А с константными данными - отправляет where на удалённую железку.

Обходные пути - сгенерировать строку SQL запроса и его выполнить - он тогда распарсится в рантайме и должен целиком уйти на удалённую железку. Либо совсем неинтересно, но точно сработает - dblink'ом сходить.
...
Рейтинг: 0 / 0
Беда
    #39326650
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,

почему неинтересно ? это как раз не надо администрировать, как случай с внешним сервером. усё в руках кодера.

т.е. :
1 -- dblink
2 кстати идеальный случай для plproxy
3 ну и думаецца если в динамику обернуть с execute с подстановкой параметров (или с вшивкой в строку)-- план будет уже с константами строиться -- может и на fdw нормально прокатить.

и проблемная идея -- сделать sql(лангвидж такой) ф--ю security invoker и попытаться посмотрть на план живьём.
...
Рейтинг: 0 / 0
Беда
    #39326653
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqMelkij,

почему неинтересно ? это как раз не надо администрировать
Неинтересно с точки зрения именно разработчика: везде был FDW, а в одном месте к той же самое железке, что уже есть в FDW - но надо дёргать dblink'ом.
DRY, лишняя сущность, все дела...

Зато KISS и будет ожидаемо работать, как бы дальше не развивался планировщик FDW.
...
Рейтинг: 0 / 0
Беда
    #39326704
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,

ну вот если есть fdw , то через него дблинком и дергать.

на все случаи запросов к удаленке трюков не напасешься.
хинта, на какой стороне исполнять -- нетути.
а т--щ сильно не в теме гетерогенных проблем. может что и похитрее захочет спросить ту сторону, и будет вопросы задавать --- " а почему оно через сетку всё гоняет ?"
...
Рейтинг: 0 / 0
Беда
    #39326705
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqMelkij,

ну вот если есть fdw , то через него дблинком и дергать.через его SERVER, как первый параметр , ессно (пользуя, соответственно, его юзер--маппинг, раз уж оскоромились)
...
Рейтинг: 0 / 0
Беда
    #39326860
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqqwwqMelkij,

ну вот если есть fdw , то через него дблинком и дергать.через его SERVER, как первый параметр , ессно (пользуя, соответственно, его юзер--маппинг, раз уж оскоромились)
А вот это здорово. Я не заметил заметку в мануале :
When using the dblink module, a foreign server's name can be used as an argument of the dblink_connect function to indicate the connection parameters.
Тогда да, dblink как штука с ожидаемым поведением будет лучшим вариантом.
...
Рейтинг: 0 / 0
Беда
    #39327267
kotahinus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы, попробовал и завернуть запрос в EXECUTE и dblink'ом. Оба варианта решают проблему на ура.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Беда
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]