Я читал кое-что о расширениях postgres и заинтересовался написанием собственного расширения на C, чтобы удовлетворить спрос моей компании.
Сценарий: У нас есть большой и медленный запрос, который перебирает все схемы, проверяя определенный столбец даты и времени из определенной таблицы. Cron запускает этот запрос каждые 5 часов.
Имеет ли смысл писать расширение, которое делает то же самое на C? Будет ли это пользой или я неправильно понимаю концепцию расширений postgres?
Голосуйте за возобновление обсуждения: на вопрос можно ответить «с фактами и цитатами». Вопрос может звучать так, но, как показывает ответ, он не очень основан на мнении, тем более что ОП описывает конкретный вариант использования.
Вы должны различать эти две вещи:
Расширение PostgreSQL — это «установочный пакет» в базе данных. Если вы создадите расширение, в базе данных автоматически будет создано несколько объектов базы данных (членов расширения). Этими объектами может быть что угодно, и они не имеют никакого отношения к коду C.
Пользовательская функция на языке C — это функция базы данных, которая вызывает функцию в общей библиотеке, которая динамически подключается к серверу при первом вызове функции в сеансе базы данных.
Возможно, имеет смысл упаковать вашу функцию C в расширение, но эти две вещи в принципе независимы.
Чтобы выяснить, будет ли ваша задача выполняться быстрее в функции C, вам нужно выяснить, на что тратится время. Если время тратится на последовательное сканирование таблиц, функция C вам не поможет. Вам понадобится индекс, чтобы ускорить это. С другой стороны, если большую часть вашего времени вы тратите на код функции PL/pgSQL, который выполняет вычисления или циклически обрабатывает результаты запроса, функция C может значительно ускорить обработку.
Какую проблему должно решить расширение? Эта работа не будет быстрее только потому, что это расширение. Так что же вы делаете, чтобы сделать по-другому? И зачем для этого нужно расширение?
SELECT pg_sleep(10);
занимает всегда одинаковое количество времени, с наращиванием или без.