TRUNCATE
tem que liberar shared_buffers
para a tabela que está sendo truncada e precisa desvincular o arquivo antigo, que pode ser lento em sistemas de arquivos com exclusão lenta como ext3
. 1,5 horas é bastante extremo, pois geralmente estamos falando de segundos no máximo. É altamente provável que você tenha outras sessões mantendo bloqueios na tabela que impedem o
TRUNCATE
de proceder. Consulte pg_catalog.pg_locks
e pg_catalog.pg_stat_activity
. O artigo wiki do PostgreSQL sobre monitoramento de bloqueio deve ser útil.
Veja também:Velocidade de truncamento do Postgresql