我有一个场景,我有一个中央服务器和一个节点。服务器和节点都能够运行PostgreSQL,但节点上的存储空间有限。节点以高速收集数据并将数据写入其本地DB。 服务器需要从节点复制数据。我计划使用Slony-I或Bucardo完成此操作。 节点需要能够以设定的间隔从其表中删除所有记录,以便最大限度地减少使用的磁盘空间。我是否应该将pgAgent与包含
等脚本的作业一起使用DELETE FROM tablex, tabley, tablez;
运行脚本的实际批处理文件类似于
@echo off
C:\Progra~1\PostgreSQL\9.1\bin\psql -d database -h localhost -p 5432 -U postgres -f C:\deleteFrom.sql
我只是在寻找意见,如果这是完成此任务的最佳方式,或者是否有人知道从远程数据库中提取数据并清除远程数据库以节省远程节点空间的更有效方法。谢谢你的时间。
答案 0 :(得分:3)
最有效的命令是TRUNCATE
命令。
使用TRUNCATE,您可以链接表格,例如:
TRUNCATE tablex, tabley, tablez;
以下是postgres文档中的描述:
TRUNCATE会快速删除一组表中的所有行。它与每个表上的非限定DELETE具有相同的效果,但由于它实际上不扫描表,因此速度更快。此外,它立即回收磁盘空间,而不是需要后续的VACUUM操作。这对大型表格最有用。
您也可以添加CASCADE
作为参数:
CASCADE自动截断所有对任何命名表或由于CASCADE而添加到组的表的外键引用的表。
答案 1 :(得分:1)
根据您的确切需求和工作流程,两个最佳选项将被截断,如@Bohemian所建议,或者创建一个新表,重命名,然后删除。
我们在一个主要项目中使用的东西与后者的创建/重命名/删除方法非常相似。这有一个优势,您需要能够非常快速地从表中删除某些数据,而不是所有数据。基本工作流程是:
创建一个架构与旧架构相同的新表
创建new_table LIKE ...
在事务中,同时重命名旧表和新表:
BEGIN; RENAME表到old_table; RENAME new_table TO table; COMMIT;
[可选]现在你可以用旧表做事了,而新表很乐意接受新的插入。您可以将数据转储到集中式服务器,对其运行查询等等。
删除旧表
DROP old_table;
当您想要保留7天的数据时,这是一个特别有用的策略,并且只会同时丢弃第8天的数据。在这种情况下执行DELETE
可能非常慢。通过将数据存储在分区中(每天一个),可以轻松地一次丢弃一整天的数据。