Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 使用postgres将大量行从一个表移动到另一个新表的有效方法_Postgresql_Postgresql Performance - Fatal编程技术网

Postgresql 使用postgres将大量行从一个表移动到另一个新表的有效方法

Postgresql 使用postgres将大量行从一个表移动到另一个新表的有效方法,postgresql,postgresql-performance,Postgresql,Postgresql Performance,我正在使用PostgreSQL数据库进行实时项目。其中,我有一个表,有8列。 这个表包含数百万行,所以为了加快表中的搜索速度,我想删除这个表中的旧条目并将其存储到另一个新表中 为此,我知道一种方法: 首先选择一些行 创建新表 将这些行存储在该表中 然后从主表中删除 但这需要太多的时间,而且效率不高 所以我想知道在postgresql数据库中执行此操作的最佳方法是什么 Postgresql版本:9.4.2. 大约行数:8000000 我想移动行:2000000这是一个用于在同一行的两个表之间复

我正在使用PostgreSQL数据库进行实时项目。其中,我有一个表,有8列。 这个表包含数百万行,所以为了加快表中的搜索速度,我想删除这个表中的旧条目并将其存储到另一个新表中

为此,我知道一种方法:

  • 首先选择一些行
  • 创建新表
  • 将这些行存储在该表中
  • 然后从主表中删除
但这需要太多的时间,而且效率不高

所以我想知道在postgresql数据库中执行此操作的最佳方法是什么

Postgresql版本:
9.4.2.

大约行数:8000000

我想移动行:2000000

这是一个用于在同一行的两个表之间复制数据的示例代码。 这里我使用了不同的数据库,一个是生产数据库,另一个是测试数据库

INSERT INTO "Table2"
select * from dblink('dbname=DB1 dbname=DB2 user=postgres password=root', 
'select "col1","Col2" from "Table1"') 
as t1(a character varying,b character varying);
可以使用CTE(公共表表达式)在单个SQL语句()中移动行:


但是仔细想想你是否真的需要它。就像评论中提到的一匹没有名字的马一样,调整您的查询可能就足够了。

与其移动较大的较旧的数据量,不如将较小的较新的数据量移动到新表中。只需指向这个新表,或者重命名这些表就可以进行适当的切换。另一个选项可能是调整主表上的查询。但是为了能够帮助你,你没有提供足够的信息。阅读:然后回答您的问题并添加缺少的信息。您有可伸缩性问题。简单回答:不要使用Postgres搜索。将整个内容导出到基于文本的搜索引擎(如Elasticsearch)并使用它。你会惊讶于他们的速度。谢谢@Bohemian。我来看看elasticsearch。但我仍然想知道移动数据的可能解决方案。没有通用的最佳方法。如果有的话,你能忍受什么样的停机时间?当您试图删除旧行时,是否有人在查询它们?它们是否需要从一张桌子上消失,然后以原子的方式重新出现在另一张桌子上?您是否有足够的空间同时放置两份完整的数据副本?
with delta as (
  delete from one_table where ...
  returning *
)
insert into another_table
select * from delta;