首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每天自动删除一次PostgreSQL表

每天自动删除一次PostgreSQL表
EN

Stack Overflow用户
提问于 2012-06-06 02:21:04
回答 2查看 1.8K关注 0票数 3

我有一个场景,其中我有一个中央服务器和一个节点。服务器和节点都可以运行PostgreSQL,但节点上的存储空间有限。节点高速采集数据,并将数据写入本地DB。服务器需要从节点复制数据。我计划用Slony-IBucardo来实现这一点。节点需要能够以设定的间隔从其表中删除所有记录,以便最大限度地减少磁盘空间的使用。我是否应该在包含以下脚本的作业中使用pgAgent

代码语言:javascript
复制
DELETE FROM tablex, tabley, tablez;

其中运行脚本的实际批处理文件如下所示

代码语言:javascript
复制
@echo off
C:\Progra~1\PostgreSQL\9.1\bin\psql -d database -h localhost -p 5432 -U postgres -f C:\deleteFrom.sql

如果这是完成此任务的最佳方法,或者是否有人知道从远程数据库提取数据并清除远程数据库以节省远程节点上的空间的更有效的方法,我只是在寻求意见。耽误您时间,实在对不起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-06 02:25:05

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

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

代码语言:javascript
复制
TRUNCATE tablex, tabley, tablez;

以下是postgres文档中的描述:

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-06-06 04:15:06

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

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

  1. 使用与旧表相同的模式创建新表

创建类似...

  • 的new_table在事务中,同时重命名新旧表:

BEGIN;RENAME table TO old_table;RENAME new_table TO table;COMMIT;

  • Optional现在您可以对旧的表执行操作,而新的表可以愉快地接受新的插入。您可以将数据转储到集中式服务器,在其上运行查询,或对旧表执行whatever.

  • Delete

DROP old_table;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10902669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档