powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / ХП на C vs plpgsql
10 сообщений из 10, страница 1 из 1
ХП на C vs plpgsql
    #34241424
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функции возвращающие setof работают (IMHO) неприлично медленно.
В частности фукция которая собирает струку запроса, потом тупо возвращает
через
Код: plaintext
for r in execute ...
,
Результат запроса.
Работает 350ms, а если просто произвести запрос, то время выполнения в пределах 20ms.
т.е. 95% времени работы ХП Уходит на накладные расходы plpgsql

Задался целью выяснить на сколько на ХП С будет быстрее.
В результате аналагичная функция на С стала работать примерно на 1% быстрее.
т.е. почти также.
Использовался SPI_execute, SPI_returntuple.
Оптимизировать код вроде уже некуда..

Получается что на С подобные функции писать не стоит.
...
Рейтинг: 0 / 0
ХП на C vs plpgsql
    #34242290
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КлючниковФункции возвращающие setof работают (IMHO) неприлично медленно.
В частности фукция которая собирает струку запроса, потом тупо возвращает
через
Код: plaintext
for r in execute ...
,
Результат запроса.

Скорее всего это тормоза "переключения контекста" (по типу Оракловых).

ЗЫ А за инфу и ковыряния - спасибо, будем-с знать.
...
Рейтинг: 0 / 0
ХП на C vs plpgsql
    #34243363
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может это из-за того, что простой запрос работает с "сылками на данные", а функции приходиться "формировать таблицу" и заполнять ее выбранными данными. Ну, то есть я хочу сказать что при возврате setof все эти данные копируються во что-то типа темповой таблицы (как конкретно это реализованно внутри я не знаю) и из за этого получаеться такая разница?
А то, что на С быстрее не стало - это не удивительно. Чему тут быстрее работать, когда практически всю работу все равно постгрес сам делает. Если б у вас в функции куча переменных туда-сюда гонялась и в цикле сложная логика крутилась - тогда думаю разница была бы заметнее.
...
Рейтинг: 0 / 0
ХП на C vs plpgsql
    #34243442
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JelisМожет это из-за того, что простой запрос работает с "сылками на данные", а функции приходиться "формировать таблицу" и заполнять ее выбранными данными.
Одни вопросы и никаких ответов.
Надо попробовать сделать функцию которая будет производить запрос, но дальше ничего с ним не делать. Это наверно позволит точно сказать, запрос тормозит или формирование
некой структуры для возврата таблицы в базу.
...
Рейтинг: 0 / 0
ХП на C vs plpgsql
    #34245700
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КлючниковФункции возвращающие setof работают (IMHO) неприлично медленно.
В частности фукция которая собирает струку запроса, потом тупо возвращает
через
Код: plaintext
for r in execute ...
,
Результат запроса.
Работает 350ms, а если просто произвести запрос, то время выполнения в пределах 20ms.
т.е. 95% времени работы ХП Уходит на накладные расходы plpgsql

Задался целью выяснить на сколько на ХП С будет быстрее.
В результате аналагичная функция на С стала работать примерно на 1% быстрее.
т.е. почти также.
Использовался SPI_execute, SPI_returntuple.
Оптимизировать код вроде уже некуда..

Получается что на С подобные функции писать не стоит.

Т.к. Вы не дали время загрузки, то осмелюсь спросить..
А Вы собственно коннект не закрывали, когда повторно её звали (хранимку на сях)... При первом вызове - есть время потгрузки (в процесс клиента), во второй - сам вызов хранимки...

с уважением
(круглый)
...
Рейтинг: 0 / 0
ХП на C vs plpgsql
    #34245801
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0
Т.к. Вы не дали время загрузки, то осмелюсь спросить..
А Вы собственно коннект не закрывали, когда повторно её звали (хранимку на сях)... При первом вызове - есть время потгрузки (в процесс клиента), во второй - сам вызов хранимки...

с уважением
(круглый)
Какой такой коннект?
explain analyze select * from func_c(1,2,3);
И все, никакой загрузки.
...
Рейтинг: 0 / 0
ХП на C vs plpgsql
    #34246038
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JelisМожет это из-за того, что простой запрос работает с "сылками на данные", а функции приходиться "формировать таблицу" и заполнять ее выбранными данными. Ну, то есть я хочу сказать что при возврате setof все эти данные копируються во что-то типа темповой таблицы (как конкретно это реализованно внутри я не знаю) и из за этого получаеться такая разница?
А то, что на С быстрее не стало - это не удивительно. Чему тут быстрее работать, когда практически всю работу все равно постгрес сам делает. Если б у вас в функции куча переменных туда-сюда гонялась и в цикле сложная логика крутилась - тогда думаю разница была бы заметнее.

Да, ответов не очень много, а те что есть, и то - не ответы а больше предположения. Квалификации не хватает :-) Но, в обоснование своего предположения, вот чего я нашел в доке по RETURN NEXT

http://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING
RETURN NEXT does not actually return from the function — it simply saves away the value of the expression.
...
Note: The current implementation of RETURN NEXT for PL/pgSQL stores the entire result set before returning from the function, as discussed above. That means that if a PL/pgSQL function produces a very large result set, performance may be poor: data will be written to disk to avoid memory exhaustion, but the function itself will not return until the entire result set has been generated. A future version of PL/pgSQL may allow users to define set-returning functions that do not have this limitation. Currently, the point at which data begins being written to disk is controlled by the work_mem configuration variable. Administrators who have sufficient memory to store larger result sets in memory should consider increasing this parameter.


Правда еще вопрос, в 15 раз медленнее толька из-за того что промежуточные результаты храняться, или еще чего тормозит.
...
Рейтинг: 0 / 0
ХП на C vs plpgsql
    #34246068
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ключников kolobok0
Т.к. Вы не дали время загрузки, то осмелюсь спросить..
А Вы собственно коннект не закрывали, когда повторно её звали (хранимку на сях)... При первом вызове - есть время потгрузки (в процесс клиента), во второй - сам вызов хранимки...

с уважением
(круглый)
Какой такой коннект?
explain analyze select * from func_c(1,2,3);
И все, никакой загрузки.

внешняя сишная функция подгружается в ПРОЦЕСС КЛИЕНТА (на стороне сервака) на момент ПЕРВОГО обращения к ней. Дальнейшее обращение происходит к уже загруженному экземпляру. Если Вы компилируетесь и подкладываете новую - то не выйдет (она загружена в процесс), пока Вы не закроете коннект на котором работал клиент (например окошечко квэри в пэджэ-админе).

я надеюс не стоит объяснять, что загрузка модуля (дэлеле под форточками) происходит не медленно, а очень медленно (по сравнению с самим запросом) ?

с уважением
(круглый)
...
Рейтинг: 0 / 0
ХП на C vs plpgsql
    #34248324
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0
внешняя сишная функция подгружается в ПРОЦЕСС КЛИЕНТА (на стороне сервака) на момент ПЕРВОГО обращения к ней.
Каким методом можно замерить время загрузки?

Я привел время выполнения без загрузки, т.к. засекал време на первого исполнения.
...
Рейтинг: 0 / 0
ХП на C vs plpgsql
    #34248829
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КлючниковЯ привел время выполнения без загрузки, т.к. засекал время на первого исполнения.

приблизительная разница между первым и последующими обращениями, не закрывая коннекшен. посему иногда актуально грузить (активировать) Ваши хранимки на момент коннекта, а не в процессе работы...

например, в админе видно время выполнения хранимки. при загрузке время значительно отличается (в большую сторону), от времени повторных выполнений.

возможно это не Ваш случай - посему начал с вопроса. Да, сказанное справедливо для сервака под форточками. Как на никсах дела обстоят - х.з...


с уважением
(круглый)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / ХП на C vs plpgsql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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