Postgresql
25M x 25M 內連接 (postgresql) 性能
我有一次需要在 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 將這些結果載入到另一個數據庫表中。