具有动态(内联)SQL的函数比PostgreSQL中的动态(内联)SQL执行得更好吗?

时间:2016-10-21 17:19:52

标签: .net database postgresql

我对PostgreSQL很新,并且有一个基本的设计问题,我想要一些建议。

我们公司在PostgreSQL数据库中定义了1000多个相同的模式。 我们为每个客户定义了单独的架构(工作场所)。 整个DB Schema设计是无法改变的。

我们必须创建例程,这些例程将从所有模式中收集数据,并将其存储在DataTables中的单独(集中)模式中。

一种方法是使用npgsql接口编写基于.Net的应用程序。应用程序将遍历所有模式并运行动态(内联)SQL以返回所需数据。

另一种方法是将所有数据收集例程推送到PostgreSQL函数中。这些函数将包含动态SQL,接受模式作为参数,然后针对目标模式运行该SQL。

这两种方法的表现有何不同? 我试图找出哪种方法在性能和可维护性方面最好。

有更好的方法吗?

谢谢, JohnB

1 个答案:

答案 0 :(得分:0)

您只需使用其他地方定义的单个函数在模式之间导航:

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的选项