使用postgres将大量行从一个表移动到另一个新表的有效方法使用postgres
问题描述:
我正在使用PostgreSQL活动项目的数据库。其中,我有一个8列的表。 此表包含数百万行,因此为了使表格更快地搜索,我想要将此表中的旧条目删除并存储到新的另一个表中。使用postgres将大量行从一个表移动到另一个新表的有效方法使用postgres
要做到这一点,我知道一种方法:
- 先选择一些行
- 在这个表
- 比从主表中删除创建新表
- 店这行。
但是它花费的时间太多,效率也不高。
所以我想知道在postgresql数据库中执行此操作的最佳方法是什么?
的PostgreSQL的版本:各行9.4.2.
约数:8000000
我想移动行:2000000
答
这对于相同的两个表之间复制数据的样本代码。 这里我使用了不同的数据库,一个是我的生产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);
答
您可以使用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一样,调整你的查询可能就足够了。
而不是移动“较大的旧的”数据量,将“较小的较新的”数据量移动到新的表中。只需指向这个新表格,或者重命名表格即可完成切换。 –
另一个选项可能是调整主表上的查询。但为了能够帮助你,你还没有提供足够的信息。阅读:http://stackoverflow.com/tags/postgresql-performance/info然后[**编辑**](http://stackoverflow.com/posts/35837354/edit)你的问题,并添加缺少的信息 –
你有可扩展性问题。简单的回答:不要使用Postgres进行搜索。将整件事导出到基于文本的搜索引擎(例如Elasticsearch)中并使用它。你会惊讶他们有多快。 – Bohemian