3

我有一个场景,我有一个中央服务器和一个节点。服务器和节点都可以运行 PostgreSQL,但是节点上的存储空间是有限的。节点高速收集数据并将数据写入本地数据库。服务器需要从节点复制数据。我计划用Slony-IBucardo来完成这个。节点需要能够以设定的时间间隔从其表中删除所有记录,以最小化使用的磁盘空间。我是否应该将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

?

如果这是完成此任务的最佳方法,或者是否有人知道从远程数据库中提取数据并清除该远程数据库以节省远程节点上的空间的更有效方法,我只是在寻找意见。谢谢你的时间。

4

2 回答 2

3

对您来说最有效的命令是TRUNCATE命令。

使用 TRUNCATE,您可以链接表,例如您的示例:

TRUNCATE tablex, tabley, tablez;

这是来自 postgres 文档的描述:

TRUNCATE 从一组表中快速删除所有行。它与每个表上的非限定 DELETE 具有相同的效果,但由于它实际上并不扫描表,因此速度更快。此外,它会立即回收磁盘空间,而不需要后续的 VACUUM 操作。这在大表上最有用。

您还可以添加CASCADE作为参数:

CASCADE 自动截断所有具有对任何命名表或由于 CASCADE 添加到组中的表的外键引用的表。

于 2012-06-05T18:25:05.310 回答
1

根据您的确切需求和工作流程,两个最佳选择是截断,正如@Bohemian 建议的那样,或者创建一个新表,重命名,然后删除。

我们在我们的一个主要项目中使用了类似于后者的创建/重命名/删除方法。这有一个优势,您需要能够非常快速地从表中删除一些数据,但不是所有数据。基本工作流程是:

  1. 使用与旧表相同的架构创建一个新表

    CREATE new_table LIKE ...

  2. 在事务中,同时重命名旧表和新表:

    开始; 将表重命名为 old_table;重命名 new_table TO 表;犯罪;

  3. [可选] 现在你可以用旧表做一些事情,而新表很乐意接受新的插入。您可以将数据转储到您的集中式服务器,在其上运行查询或其他任何方式。

  4. 删除旧表

    删除旧表;

当您想保留 7 天左右的数据并且一次只丢弃第 8 天的数据时,这是一个特别有用的策略。DELETE在这种情况下执行 a可能会非常慢。通过将数据存储在分区中(每天一个),一次删除一整天的数据很容易。

于 2012-06-05T20:15:05.810 回答