在 postgres sql 中试图在一个短时间内删除 10000 个表时从共享内存中获取错误增加 max_locks_per_transaction

While trying to drop 10000 tables in one short in postgres sql getting error out of shared memory increase max_locks_per_transaction

共享内存不足提示:您可能需要增加 max_locks_per_transaction。 我们以逗号分隔 tables table_names 的形式传递输入,并试图删除一个巨大的 一组 table

        CREATE OR REPLACE FUNCTION "Schema".drop_tables(table_names character varying
          RETURNS void AS
        $BODY$
        DECLARE tables text[];
        DECLARE table_name VARCHAR;
        BEGIN
        SET search_path='Schema';
        SELECT into tables string_to_array(table_names,',');
        FOREACH table_name IN ARRAY tables
        LOOP
            EXECUTE format('DROP TABLE %I', table_name);
        END LOOP;
        END;
        $BODY$
          LANGUAGE plpgsql VOLATILE
          COST 100;
        ALTER FUNCTION "Schema".drop_tables(character varying)
          OWNER TO postgres;

当我通过 1000 table 秒时它运行良好,但当我通过 10000 table 秒时它会抛出错误。 它只是抛出异常以增加 max_locks_per_transaction 该功能可用的最大锁数是多少?有什么办法 计算我们应该增加多少 max_locks_per_transaction value 默认值为64.

删除 table 需要对 table、其所有索引和 TOAST table 及其索引(如果存在)进行 ACCESS EXCLUSIVE 锁定。此类锁存储在共享内存锁 table 中,其中有 max_connections * max_locks_per_transaction 个条目的空间。锁一直持有到事务结束,函数总是在单个事务中执行。

因此,如果您需要超过默认的 6400 个锁定 table 条目来删除所有 table,请增加参数或将操作分布在多个数据库事务中。