2011-07-07 13 views
5

Tengo una tabla en una base de datos de postgres que se está utilizando en un entorno de prueba donde tenemos que agregar y soltar varias columnas a la vez. El problema es que postgres tiene un máximo de 1600 columnas, y este conteo incluye columnas caídas. Mi mesa nunca tendrá 1600 columnas "sin soltar" en total, pero con el tiempo se acumula a más de las 1600 con caídas.Borrar el conocimiento postgres de las columnas caídas

He intentado usar VACUUM y VACUUM FULL, y he probado la refundición de una columna existente como su propio tipo (ALTER TABLE table ALTER COLUMN anycol TYPE anytype) para causar postgres para escanear todas las columnas y limpiar la memoria de columnas borradas, pero ninguno de estos restablecen el "número de columna" de postgres.

Sé que esto podría ser resuelto copiando toda la tabla, pero eso tiene sus propios problemas, y es en una pregunta separada.

¿Conoces alguna manera de hacer que el postgres olvide que se le han caído las columnas?

Sé que postgres no fue diseñado para aplicaciones como esta, pero no voy a entrar en por qué elegimos implementarlo de esta manera. Si tiene una herramienta alternativa para usar, me interesaría saberlo, pero aún me gustaría encontrar una solución a esto.

+0

Dijiste que habías probado 'VACUUM' sobre la mesa. ¿Qué pasa con 'VACUUM FULL'? O tal vez, 'tabla ALTER TABLE ALTER COLUMN anycol TYPE anytype;', cambiando una columna al mismo tipo que ya tiene. –

+0

Como ya descubrió, hay al menos dos formas1): CREATE TABLE nuevo AS seleccionar * FROM the_table; cambiar el nombre de las cosas; El otro es pg_dump - t thetable; deja caer la mesa; recree la tabla de los resultados de pg_dump. En AMBOS casos, tendrá que reconstruir las restricciones FK (que es un poco más simple en el segundo caso) – joop

Respuesta

5

Esto no es posible, aparte de recrear la tabla, como ya descubrió.

De lo contrario, el sistema de la base de datos tendría que realizar un seguimiento de alguna manera cuando el almacenamiento utilizado por una columna eliminada se haya eliminado en todas partes, y luego renumerar los atributos. Eso sería increíblemente caro y complicado.

+0

Eso es bueno saber. Ahora solo necesito descubrir cómo [copiar la tabla de forma efectiva] (http://stackoverflow.com/questions/6601978/completely-copying-a-postgres-table-with-sql) – Erik

+2

Para mí, esto se ve como un trabajo para VACUUM FULL (incluyendo ANALYZE?), reescribe la tabla de todos modos y también necesita un bloqueo de tabla. Una actualización de pg_class no sería demasiado cara, en comparación con todos los demás trabajos que tiene que hacer. –

0

La tabla de sistema pg_attribute aún muestra columnas antiguas (eliminadas). No sé por qué, pero parece un error para mí.

SELECT 
    relnatts, 
    attname, 
    attisdropped 
FROM 
    pg_class 
    JOIN pg_attribute att ON attrelid = pg_class.oid 
WHERE 
    relname = 'your_table_name'; 

Podría enviar un informe de error, incluyendo un sencillo ejemplo, a [email protected] o http://www.postgresql.org/support/submitbug?

+0

Si la memoria es válida, en realidad está ahí para las declaraciones de la tabla alter-aware. Pero sí, debería soltar la fila eventualmente. :-) –

+1

No, esto no es un error. –

Cuestiones relacionadas