2016-03-07 17 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一樣,調整你的查詢可能就足夠了。

相關問題