From: | Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl> |
---|---|
To: | Chema Cortés <ch3m4(at)ch3m4(dot)org> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Error al truncar una tabla |
Date: | 2005-01-20 15:25:04 |
Message-ID: | 20050120152504.GA10628@dcc.uchile.cl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
On Thu, Jan 20, 2005 at 03:43:32PM +0100, Chema Cortés wrote:
Chema,
> Como acabo de subscribirme, me presento: soy Chema Cortés, analista
> programador trabajando en la sanidad pública de España. He programado con
> diversos lenguajes de programación, pero actuálmente utilizo python en
> exclusiva. He decidido apostar fuerte por el uso del postgres en mis
> proyectos, así que espero participar de pleno en esta lista.
Bienvenido! Muchas gracias por tener la cortesía de presentarte.
> He tenido un problema al truncar una tabla. El error era algo así:
>
> ERROR: expected both swapped tables to have TOAST tables
>
> Por lo que he podido averiguar, este error se produce cuando se ha borrado
> alguna columna de la tabla. Al parecer, postgres nunca borra columnas, por
> más que se haga un VACUUM FULL. No he tenido más remedio que borrar
> totalmente la tabla y volverla a recrear para evitar éste error.
>
> ¿Existe algún método mejor para eliminar columnas borradas? ¿Álguien podría
> explicarme a qué se refiere el mensaje de error con "swapped tables" y "toast
> tables"?
Es un error corregido en 7.4.6 (actualiza, es trivial: no necesitas
hacer dump). Los detalles los puedes encontrar probablemente en los
archivos de la lista pgsql-hackers, en las cercanias del 31 de agosto de
2004.
TOAST es un mecanismo para almacenar columnas grandes (en registro >
2kB). La tabla toast es una tabla externa donde se almacenan estas
cosas. En la documentacion oficial de 8.0 (no está documentado en
versiones anteriores, pero el mecanismo es el mismo), revisa en el
capitulo de Internals la parte que habla de "database storage".
Lo de swapped tables es porque para implementar truncate (y otros como
REINDEX y CLUSTER) lo que se hace es crear un nuevo archivo fisico donde
se aloja la tabla. Luego a la identificacion de la tabla en el catalogo
de sistema se le cambia el archivo fisico antiguo por el nuevo (swap).
Lo que el sistema quiere es que tanto el descriptor antiguo como el
nuevo tengan tablas TOAST; lo malo es que si tienes una tabla
a int, b int, c text
esta tabla lleva una tabla toast asociada (para posiblemente almacenar
el campo c), pero si borras el campo c, la nueva tabla que se creará
para hacer el truncate no lleva tabla toast porque no hay campos
"grandes" para almacenar. Como ya dije, esto es un bug.
--
Alvaro Herrera (<alvherre[(at)]dcc(dot)uchile(dot)cl>)
"La fuerza no está en los medios físicos
sino que reside en una voluntad indomable" (Gandhi)
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2005-01-20 15:46:54 | Re: ayuda con conexion y cursor |
Previous Message | Milton inostroza | 2005-01-20 15:21:47 | ayuda con conexion y cursor |