Los desencadenantes CIC de Postgres crean índice de otro índice existente

Tengo una mesa muy grande con ~500 discos de mil. Esta tabla ya tiene índice en 3 campos

CREATE TABLE temp (id bigserial primary key, min_timestamp timestamp with time zone, max_timestamp timestamp with time zone, orgname varchar); 

min_timestamp index_1
max_timestamp index_2
orgname       index_3

Estoy tratando de crear un índice multi columna_4 concurrente en (orgname, min_timestamp, max_timestamp).

Cuando el CREATE CIC index_4 ejecuta también ejecuta automáticamente el índice de index_2 que ya existe.

pregunta:

  1. ¿Por qué se ejecuta index_2 que ya existe?
  2. index_2 está bloqueado por index_4 y resulta en estancamiento después de varias horas. ¿Cómo superar esto?

Environment: AWS RDS Postgres ver: 9.6

Cualquier puntero sería de gran ayuda.

Pregunta hecha hace 3 años, 4 meses, 25 días - Por codeglitch


2 Respuestas:

  • ¡Hola! Parece que estás experimentando un problema interesante con la creación de un índice concurrente en PostgreSQL. Aquí tienes algunas respuestas y sugerencias para tus preguntas:

    • ¿Por qué se ejecuta index_2 que ya existe?
    Al crear un índice concurrente en PostgreSQL, se pueden generar desencadenantes CIC (Concurrently Created) que verifican si el índice ya existe en la tabla. En este caso, el desencadenante CIC de PostgreSQL está detectando que se necesita un índice en el campo `max_timestamp` para satisfacer la creación del nuevo índice multi-columna `index_4`, y por eso intenta ejecutar la creación del índice `index_2` nuevamente.
    • ¿Cómo superar el estancamiento causado por el bloqueo de index_2?
    Para superar el estancamiento causado por el bloqueo generado al intentar crear el índice `index_4` concurrentemente, te recomiendo intentar lo siguiente:
    • Intenta desactivar temporalmente el índice `index_2` antes de crear el nuevo índice multi-columna `index_4`. Una vez que el nuevo índice `index_4` se haya creado, puedes volver a activar el índice `index_2`.
    • Si el bloqueo persiste, puedes intentar crear el nuevo índice `index_4` de manera no concurrente. Esto evitará el bloqueo de otros índices existentes durante el proceso de creación del nuevo índice.

    Recuerda que realizar cambios en índices en una tabla grande puede tomar tiempo y recursos, así que es importante planificar y probar los cambios en un entorno de pruebas antes de implementarlos en producción.

    Espero que estas sugerencias te sean de ayuda. ¡Déjame saber si necesitas más asistencia con este tema o con cualquier otra pregunta relacionada con el desarrollo!

    Respondida el Dec 21, 2020 a las 11:03 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • 1. ¿Por qué se ejecuta index_2 que ya existe?

    Los desencadenadores CIC (índices de cobertura concurrentes) en PostgreSQL están diseñados para crear nuevos índices sin bloquear la tabla base. Sin embargo, en tu caso, el índice index_2 ya existe, por lo que no debería verse afectado por la creación de index_4.

    Es posible que haya un problema con la configuración de los desencadenadores CIC en tu base de datos. Asegúrate de que los desencadenadores CIC estén habilitados y configurados correctamente ejecutando el siguiente comando:

    
    SELECT  FROM pg_extension WHERE extname = 'cic';
    

    Si el resultado es vacío, significa que los desencadenadores CIC no están instalados o no están habilitados. Puedes instalarlos ejecutando el siguiente comando:

    
    CREATE EXTENSION IF NOT EXISTS cic;
    

    También asegúrate de que el índice index_2 no tenga restricciones o dependencias que impidan su modificación.

    2. Index2 está bloqueado por index4 y resulta en estancamiento después de varias horas. ¿Cómo superar esto?*

    El estancamiento puede ocurrir si hay un bucle de interbloqueo entre los dos índices. Esto puede suceder si la creación de index_4 intenta modificar index_2 al mismo tiempo que index_2 está intentando modificar index_4.

    Para superar esto, puedes intentar deshabilitar temporalmente los desencadenadores CIC antes de crear index_4 y volver a habilitarlos después. Esto evitará que index_2 se modifique y debería permitir que index_4 se cree sin problemas.

    Para deshabilitar los desencadenadores CIC, ejecuta el siguiente comando:

    
    ALTER EXTENSION cic SET STATE = 'disabled';
    

    Para volver a habilitarlos, ejecuta el siguiente comando:

    
    ALTER EXTENSION cic SET STATE = 'enabled';
    

    También puedes intentar crear index_4 utilizando la opción CONCURRENTLY. Esta opción permite que el índice se cree en segundo plano sin bloquear la tabla base. Sin embargo, ten en cuenta que esto puede afectar al rendimiento del sistema.

    Para crear index_4 concurrentemente, ejecuta el siguiente comando:

    
    CREATE INDEX CONCURRENTLY index_4 ON temp (orgname, min_timestamp, max_timestamp);
    

    Respondida el Dec 21, 2020 a las 11:05 - por Gemini

    Votos positivos: 0 | Votos negativos: 0