2016-03-07 16 views
3

我正在使用PostgreSQL活动项目的数据库。其中,我有一个8列的表。 此表包含数百万行,因此为了使表格更快地搜索,我想要将此表中的旧条目删除并存储到新的另一个表中。使用postgres将大量行从一个表移动到另一个新表的有效方法使用postgres

要做到这一点,我知道一种方法:

  • 先选择一些行
  • 在这个表
  • 比从主表中删除创建新表
  • 店这行。

但是它花费的时间太多,效率也不高。

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

的PostgreSQL的版本:各行9.4.2.
约数:8000000
我想移动行:2000000

+1

而不是移动“较大的旧的”数据量,将“较小的较新的”数据量移动到新的表中。只需指向这个新表格,或者重命名表格即可完成切换。 –

+2

另一个选项可能是调整主表上的查询。但为了能够帮助你,你还没有提供足够的信息。阅读:http://stackoverflow.com/tags/postgresql-performance/info然后[**编辑**](http://stackoverflow.com/posts/35837354/edit)你的问题,并添加缺少的信息 –

+0

你有可扩展性问题。简单的回答:不要使用Postgres进行搜索。将整件事导出到基于文本的搜索引擎(例如Elasticsearch)中并使用它。你会惊讶他们有多快。 – Bohemian

回答

4

这对于相同的两个表之间复制数据的样本代码。 这里我使用了不同的数据库,一个是我的生产DB等是我的测试DB

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); 
2

您可以使用CTE(公共表表达式),以在单个SQL语句移动行(more in the documentation):

with delta as (
    delete from one_table where ... 
    returning * 
) 
insert into another_table 
select * from delta; 

但仔细想想你是否真的需要它。就像评论中说的a_horse_with_no_name一样,调整你的查询可能就足够了。

相关问题