es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mientras intentaba eliminar 10000 tablas de una sola vez en PostgreSQL, obtuve el siguiente error: “Se superó la memoria compartida. Aumente el límite max_locks_per_transaction”.

Fuera de la memoria compartida PISTA: Probablemente necesitarás aumentar maxlockspertransaction. Estamos pasando las tablas separadas por comas como entrada e intentando eliminar un conjunto grande de tablas.

CREATE OR REPLACE FUNCTION "Esquema".drop_tables(table_names character varying)
          RETURNS void AS
        $BODY$
        DECLARE tables text[];
        DECLARE table_name VARCHAR;
        BEGIN
        SET search_path='Esquema';
        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 "Esquema".drop_tables(character varying)
          OWNER TO postgres;

Funciona bien cuando paso 1000 tablas, pero arroja un error cuando paso 10000 tablas. Simplemente arroja una excepción para aumentar maxlockspertransaction. ¿Cuántos bloqueos máximos están disponibles para la función? ¿Hay alguna forma de calcular cuánto debemos aumentar el valor de maxlockspertransaction? Por defecto, el valor es 64.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El número máximo de bloqueos disponibles para la función está determinado por el valor establecido para el parámetro de configuración max_locks_per_transaction en el servidor PostgreSQL. De forma predeterminada, este valor está configurado en 64.

    Para calcular cuánto se debe aumentar el valor de max_locks_per_transaction, debemos considerar el número de tablas que se están eliminando y el número de bloqueos requeridos para cada tabla. El número de bloqueos requeridos por tabla depende de varios factores, como el tamaño de la tabla, la complejidad de los índices y el número de transacciones concurrentes que acceden a la tabla.

    Una forma de calcular el valor requerido para max_locks_per_transaction es comenzar con un valor más alto y monitorear el rendimiento del sistema durante las eliminaciones de tablas. Si el rendimiento del sistema se ve afectado, podemos disminuir gradualmente el valor hasta encontrar el valor óptimo que pueda manejar el número requerido de bloqueos sin afectar adversamente el rendimiento del sistema.

    En resumen, el valor de max_locks_per_transaction debe aumentarse en función del caso de uso específico y los requisitos del sistema, y monitorear el rendimiento del sistema durante las eliminaciones de tablas puede ayudar a determinar el valor óptimo.

Comments are closed.