长时间运行的函数未在PostgreSQL中返回响应

时间:2019-11-28 06:16:44

标签: sql postgresql performance function pgadmin

我在PostgreSQL数据库中遇到一个奇怪的问题。我有一个相当简单的函数,我在其中传递列及其ID的数组。

该函数遍历column数组并将数据插入表中。 问题是,如果列数较少且要插入的数据较小,则它将成功运行该函数并为我提供插入的行。但是,如果有很多列,则花费了超过4分钟的时间,则该函数卡住了,并且没有给出任何响应。甚至认为数据已插入表中。

该函数卡住了,甚至没有给出任何错误的响应。它只会继续运行直到发生超时异常。但要注意的一件事是,它成功插入了记录。

我已经使用PgAdmin,DBeaver进行了尝试,并且还使用了C#进行了测试,结果相同。对于小数据,它成功地给出了响应并插入了记录,但是对于大数据,它插入了记录,但未给出响应。

编辑 我检查了pg_stat_activity,它显示了功能的完成。查询成功运行,并且不再在pg_stat_activity表中。 请注意,将插入590万个潜在客户。 完整功能

CREATE OR REPLACE FUNCTION admin.insert_data_into_table(customer_column_names text[], customer_column_ids int[] , schema_name text, dyn_table_name text, bucket_id int, partial_query text)
 RETURNS integer
 LANGUAGE plpgsql
AS $function$
declare
    n INTEGER := 0;
    offset_counter INTEGER := 0;
    i integer;
    chunk_size integer := 10000;
begin
    EXECUTE format('set search_path to %I', schema_name);
    EXECUTE format('SELECT count(*) FROM %I.%I', schema_name, dyn_table_name) into n;
    for i in 1..array_upper(customer_column_ids, 1)
    loop
        offset_counter = 0;
        loop
        EXIT WHEN offset_counter > n; 
            Execute Format('insert into %s.table (customer_id, customer_column_id, value, bucket_id) 
            select _customer_id, %s, %s, %s from %s.%s %s order by _customer_id offset %s limit %s', 
            schema_name, customer_column_ids[i], customer_column_names[i], bucket_id, schema_name, dyn_table_name, partial_query, offset_counter, chunk_size);
            offset_counter := offset_counter + chunk_size; 
        end loop;
    end loop;
    return n;
end;
$function$;

0 个答案:

没有答案