Re: Error al truncar una tabla

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)

In response to

Responses

Browse pgsql-es-ayuda by date

  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