Tengo una tabla con 200 GB de tamaño ocupada por datos y 180 GB de tamaño por los 6 índices. Tiene un 30% de hinchazón, por lo que quiero recuperar el espacio no deseado que ocupa. Se agrupa en el job_id_id
índice x.
Entonces, para recuperar el espacio, ¿debo usar el cluster
comando o el vacuum full
comando?
¿Cuál es la diferencia entre estos dos comandos?
¿El
vacuum full
orden por alguna columna es igual alcluster
comando?¿Se recrea el índice en ambos comandos?
En mi caso, ¿cuál será más rápido?
La versión de la base de datos PostgreSQL es 9.1
Respuestas:
Para comprobar qué
CLUSTER
hace, tomé una tabla mía de un experimento anterior que básicamente contenía los primeros 10 millones de enteros positivos. Ya eliminé algunas filas y también hay otra columna, pero estas solo afectan el tamaño real de la tabla, por lo que no es tan interesante.Primero, después de correr
VACUUM FULL
sobre la mesafka
, tomé su tamaño:Luego, veamos el orden físico de los datos desde el comienzo de la tabla:
Ahora eliminemos algunas filas:
Después de esto, el tamaño de la tabla informada no cambió. Entonces, veamos ahora qué
CLUSTER
hace:Después de la operación, el tamaño de la tabla cambió de 338 a 296 MB. En la
ctid
columna, que describe el lugar físico de la tupla en la página, también ve que no hay ningún espacio dondeid = 5
solía estar la coincidencia de filas .A medida que se reordenaron las tuplas, los índices deberían haberse recreado para que apuntaran a los lugares correctos.
Entonces, la diferencia parece ser que
VACUUM FULL
no ordena las filas. Hasta donde yo sé, hay alguna diferencia en el mecanismo que usan los dos comandos, pero desde un punto de vista práctico, esta parece ser la principal (¿única?) Diferencia.fuente
ctid
columna. Resulta que es una columna del sistema que describe la ubicación física de la fila dentro de su tabla. postgresql.org/docs/current/ddl-system-columns.htmlhttp://www.postgresql.org/docs/9.1/static/sql-vacuum.html
http://www.postgresql.org/docs/9.1/static/sql-cluster.html
también interesante: is-a-reindex-required-after-cluster
Pero tal vez todo lo que necesita es un simple
REINDEX
que reconstruya un índice utilizando los datos almacenados en la tabla del índice, reemplazando la copia anterior del índice.http://www.postgresql.org/docs/9.1/static/sql-reindex.html
fuente