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:
- ¿Por qué se ejecuta index_2 que ya existe?
- 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?
- ¿Cómo superar el estancamiento causado por el bloqueo de index_2?
- 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 deindex_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 modificarindex_2
al mismo tiempo queindex_2
está intentando modificarindex_4
.Para superar esto, puedes intentar deshabilitar temporalmente los desencadenadores CIC antes de crear
index_4
y volver a habilitarlos después. Esto evitará queindex_2
se modifique y debería permitir queindex_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ónCONCURRENTLY
. 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