Postgresql

25M x 25M 內連接 (postgresql) 性能

  • April 8, 2018

我有一次需要在 25M 行上進行 25M 行的內部連接。盒子是Alienware area 51,4核25GB記憶體和SATA驅動(非系統盤)。到目前為止,它已經花費了 22 小時。我做了 btree 索引 ID (bigint) 列,這兩個表都在進行連接。有小費嗎?你覺得我要等多久?

EXPLAIN SELECT
   public.products_by_location_mv.id,
   public.products_by_location_mv."data_object.unique_id",
   public.products_by_location_mv.location AS outline,
   public.products_by_location_mv.elevation_ft,
   public.products_by_location_mv."geo_product.geo_product_id" AS pid,
   public.products_by_location_mv.cntry_name,
   public.products_by_location_mv.product_name,
   public.products_by_location_mv.product_type,
   public.products_by_location_mv.product_producer,
   public.products_by_location_mv.product_size,
   public.products_by_location_mv.do_location,
   public.products_by_location_mv.product_location,
   public.obj4.uid AS oid,
   public.obj4.size_bytes,
   public.obj4.object_date,
   public.obj4.description,
   public.obj4.location AS path
INTO
   public.inventory0
FROM
   public.obj4
INNER JOIN
   public.products_by_location_mv
ON
   (
       public.obj4.id = public.products_by_location_mv.id) ;

"Hash Join  (cost=3825983.03..12908235.27 rows=24202368 width=1356)"
"  Hash Cond: (products_by_location_mv.id = obj4.id)"
"  ->  Seq Scan on products_by_location_mv  (cost=0.00..1457298.68 rows=24202368 width=721)"
"  ->  Hash  (cost=1414691.68..1414691.68 rows=25507868 width=643)"
"        ->  Seq Scan on obj4  (cost=0.00..1414691.68 rows=25507868 width=643)"

就像我說的,它是一次性操作(我需要它對一些大數據進行一次性清理,而且它永遠不像 ACID 時代的東西那樣合規)。

也就是說,我確實嘗試過使用更少的列,並且性能非常好。37 分鐘。(快速 VACUUM 也可能有所幫助)。

見下文:

SELECT
   public.obj4.id,
   public.obj4.size_bytes,
   public.obj4.object_date,
   public.obj4.description,
   public.pid_table.pid
INTO 
   public.obj_data
FROM
   public.obj4
INNER JOIN
   public.pid_table
ON
   (
       public.obj4.id = public.pid_table.id);
16:33:22  [SELECT - 0 row(s), 2278.507 secs]  Command processed. No rows were affected
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 2278.507/0.000 sec  [0 successful, 1 warnings, 0 errors]

雖然我很難理解這種查詢的動機,但你不能指望任何效率,因為查詢結果不適合主記憶體。如果您希望以某種方式儲存結果,唯一的方法是通過 COPY 命令(http://www.postgresql.org/docs/9.2/static/sql-copy.html)。COPY 的優點是,一旦從查詢中檢索到一行,它就會直接進入輔助儲存。這樣,您實際上有機會在幾個小時後完成查詢。然後,如果需要,您可以再次使用 COPY 將這些結果載入到另一個數據庫表中。

引用自:https://dba.stackexchange.com/questions/60110