Работают ли функции с динамическим (встроенным) SQL лучше, чем с динамическим (встроенным) SQL в PostgreSQL?

#.net #database #postgresql

#.net #База данных #postgresql

Вопрос:

Я довольно новичок в PostgreSQL, и у меня есть основной вопрос дизайна, по которому я хотел бы получить совет.

У нашей компании более 1000 идентичных схем, определенных в нашей базе данных PostgreSQL. У нас есть отдельные схемы (рабочие места), определенные для каждого из наших клиентов. Общий дизайн схемы БД — это то, что нельзя изменить.

Мы должны создать подпрограммы, которые будут собирать данные из всех схем и хранить их в таблицах данных в отдельной (централизованной) схеме.

Одним из подходов было бы написать .Сетевое приложение, использующее интерфейс npgsql. Приложение будет перебирать все схемы и запускать динамический (встроенный) SQL для возврата желаемых данных.

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

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

Есть ли лучший подход?

Спасибо, Джонб

Ответ №1:

Вам просто нужно перемещаться между схемами, используя единственную функцию, определенную в другом месте:

 create table public.t (i int);
  

Создайте функцию в определенной схеме, которая использует объект, общий для всех схем:

 create function public.f()
returns t as $$
    select * from t;
$$ language sql;
  

Перейдите к схеме, в которой вы хотите использовать эту функцию:

 create schema s1;
set schema 's1';
create table s1.t (like public.t);
insert into s1.t (i) values (1);
  

Поскольку ‘s1’ является текущей схемой, функция будет запрашивать объект в этой схеме:

 select * from public.f();
 i 
---
 1
  

Поиск параметров при манипулировании схемой search_path