Estoy haciendo un ajuste de rendimiento en una de las mesas más grandes de nuestro proyecto. Mientras leía sobre índices, encontré el índice parcial en PostgreSQL. Esta parece una muy buena idea para poner índices solo en las filas a las que se accede con frecuencia.
Sin embargo, no puedo averiguar cómo se actualiza el índice parcial. Por ejemplo, tengo una tabla con las siguientes columnas:
task_uuid, job_id, enqueued_at, updated_at, task_status task_status= ENQUEUED, RUNNING, ASSIGNED, FAILED Buscamos los registros que están en estado ENQUEUED con mucha frecuencia. Si agregamos un índice parcial en (task_uuid, task_status) , creará una clave única y mejorará el rendimiento. Pero quiero saber qué sucede cuando el registro se actualiza, cuando actualizamos el estado del registro RUNNING . (task_uuid, task_status) sigue siendo único, pero ¿se eliminará del índice parcial? ya que el registro no cumple la condición.
Si agregamos un índice parcial en (task_uuid, task_status), creará una clave única y mejorará el rendimiento.
Solo lo creará como único si lo especifica en la definición del índice. De lo contrario, no será un índice único, incluso esas columnas son únicas.
Cuando se actualiza un registro para que ya no coincida con el predicado WHERE del índice, no le sucede nada al índice. Todavía tiene un puntero a la fila, solo apunta a algo que ya no es válido. Si especificó el índice como ÚNICO, al insertar una tupla de índice en conflicto, seguirá el puntero de la tupla anterior a la tabla, se dará cuenta de que no es válida y permitirá que continúe la inserción.
La próxima vez que se aspire la mesa, se limpiarán esos punteros obsoletos. Las tablas de cola con índices parciales por lo general deben aspirarse con frecuencia (más frecuentemente que la predeterminada) porque el índice se hincha fácilmente. La configuración de Autovac depende de la fracción de las filas de la tabla obsoletas, no de la fracción de las filas del índice obsoletas. Para índices parciales, estas fracciones no son iguales. (Por otro lado, no parece tener un estado de "COMPLETADO". Si las tareas completadas se eliminan de inmediato, tal vez la tabla de la cola permanezca lo suficientemente pequeña como para que esto no importe).
Además, cuando un escaneo de índice sigue el puntero del índice a la tabla y encuentra que la fila ya no es visible para nadie , marcará la entrada del índice como inactiva. Entonces, los futuros escaneos de índices no tendrán que saltar inútilmente a la mesa. Pero este "microvacío" solo ocurre para escaneos de índice regulares, no escaneos de mapa de bits, y solo ocurre para consultas realizadas en el maestro, no para cualquiera realizado solo en un modo de espera en caliente.