Я хотел бы написать функцию API, которая является модульной. Проблема в том, что в модульных деталях есть одинаковых запросов. У меня есть подозрение, что одни и те же запросы в каждой подфункции будут влиять на производительность.Функция Break PL/pgSQL на более мелкие части
Пример:
MAIN_FUNCTION: base_data(customer_id, user_id) {
SELECT *
FROM get_absence(customer_id, user_id)
JOIN get_work_hours(customer_id, user_id)
USING (worker_id)
}
get_absence(customer_id, user_id) {
RETURN QUERY
SELECT *
FROM get_user_workers(customer_id, user_id)
JOIN absence_table
USING (worker_id)
}
get_work_hours(customer_id, user_id) {
RETURN QUERY
SELECT *
FROM get_user_workers(customer_id, user_id)
JOIN workhours_table
USING (worker_id)
}
К сожалению для псевдокода, но это немного короче. В основном, большинство подфункций будет содержать запрос get_user_workers. Если бы я построил большую и скучную функцию, я бы запросил рабочих с общим табличным выражением.
Как добиться читаемости и модульности вместо бесчисленных строк запросов?
*** Всегда *** включать полную функцию заголовок (и нижние колонтитулы) с именем, параметрами, типами данных, типа возвращаемого значения языка декларация, ... И, конечно, ваша версия Postgres. –
Является ли ваше последнее предложение действительно вашим вопросом? Остальная часть вашего сообщения звучит так, как будто вы действительно спрашиваете: «Как мне избежать вызова get_user_workers() несколько раз»? –
Этот стиль является самым худшим с точки зрения производительности. Вы можете очень эффективно блокировать оптимизатор запросов. SQL не поддерживает эту небольшую детализацию. Если вам это нужно, используйте вместо них тривиальные однострочные функции запроса sql. –