支持模式的postgresql复制

支持模式的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

我正在尝试使用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 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委托插入到不同的目标表中?