支持模式的postgresql复制
我正在尝试使用postgresql COPY命令从CSV加载一些数据。诀窍是我想在一个用户ID(包含在CSV中)上实现多租户。在加载csv时,是否有一种简单的方法可以告诉postgres copy命令基于此用户ID进行筛选支持模式的postgresql复制,postgresql,multi-tenant,Postgresql,Multi Tenant,我正在尝试使用postgresql COPY命令从CSV加载一些数据。诀窍是我想在一个用户ID(包含在CSV中)上实现多租户。在加载csv时,是否有一种简单的方法可以告诉postgres copy命令基于此用户ID进行筛选 i、 e.所有userid=x的行转到schema=x,userid=y的行转到schema=y。仅使用COPY命令是无法做到这一点的,但您可以将所有数据复制到主表中,然后组合一个简单的PL/PGSQL函数来完成这一操作。类似这样的事情- CREATE OR REPLACE
i、 e.所有userid=x的行转到schema=x,userid=y的行转到schema=y。仅使用COPY命令是无法做到这一点的,但您可以将所有数据复制到主表中,然后组合一个简单的PL/PGSQL函数来完成这一操作。类似这样的事情-
CREATE OR REPLACE FUNCTION public.spike()
RETURNS void AS
$BODY$
DECLARE
user_id integer;
destination_schema text;
BEGIN
FOR user_id IN SELECT userid FROM master_table GROUP BY userid LOOP
CASE user_id
WHEN 1 THEN
destination_schema := 'foo';
WHEN 2 THEN
destination_schema := 'bar';
ELSE
destination_schema := 'baz';
END CASE;
EXECUTE 'INSERT INTO '|| destination_schema ||'.my_table SELECT * FROM master_table WHERE userid=$1' USING user_id;
-- EXECUTE 'DELETE FROM master_table WHERE userid=$1' USING user_id;
END LOOP;
TRUNCATE TABLE master_table;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
这将从主表中获取所有唯一的用户ID,使用CASE语句确定目标架构,然后执行INSERT SELECT以移动行,最后删除移动的行。此函数所做的只是一系列INSERT SELECT。这只是自动移动行并从主表中删除它们的过程。这会起作用,但不幸的是,此导入必须定期运行(每5分钟左右一次),我觉得这也将保留我的数据库busy@OrenMazor你没有很多其他选择。。。这可以跑得很快。每次运行有多少用户/模式和行?因此,我假设我们将在这个循环上迭代约10万次,但每次执行的插入选择将针对相对较少的行数。在
userid
上有一个索引,这应该非常快。每次迭代都需要3毫秒以上的时间才能使这个函数有趣5分钟以上,但我希望它所花费的时间少于5分钟。即使考虑到复印的时间,你也应该在5分钟内到达。然而,可能还有一些其他的解决方案——一些不同的模式设计或客户机更改使这成为一个问题。在不知道意图的情况下很难说。另一个问题是,有这么多可能性的案例是不可行的。您可能希望将其替换为从某个表中选择,该表可以将用户ID
与其架构名称匹配。这会增加时间,但如果对该表上的userid
列编制索引,则不会增加太多时间。创建一个分区表怎么样,其中基表根据userid委托插入到不同的目标表中?