2012-07-25 12 views
3

我有一個觀點,拉1mil左右的記錄;大約需要15分鐘才能創建臨時表。不過,我的CPU內核中只有1個顯示負載,其他7個內核可用。我如何在這個過程中使用所有內核?基於視圖創建表 - 最快的方法,使用多線程

create table feed_03_tmp as SELECT * FROM feed_03; 
+0

你是CPU綁定還是IO綁定?你是否爲你的工作負載優化了配置參數? – 2012-07-25 04:40:14

+0

根據視圖和查詢計劃的不同,您可以嘗試爲_that_客戶端提供更多內存來處理:'將work_mem設置爲'1GB'。 – 2012-07-25 10:32:38

+0

設置work_mem非常高,有時會有所幫助,但通常不是一個好建議。這一切都取決於視圖定義:如果可以進行合併連接,那麼這應該是首選(恕我直言),特別是對於大型結果集。 – wildplasser 2012-07-25 14:10:13

回答

1

PostgreSQL的後端是單線程並且存在每個客戶端一個後端因此單個客戶端只能使用單個芯。然而,對於這樣一個簡單的查詢,我很肯定你是IO綁定的。如果你是IO界限的,那麼執行這個工作的一個核心將會低於100%的負載,如果它始終處於100%CPU佔用。

您可以通過打開多個連接來使用多個核心,並讓每個核心都複製一行選擇,但正如我所說的那樣,這可能不會有幫助。請注意,每個連接都將在它自己的事務中。

要提高IO性能,您可以將臨時表存儲在單獨的驅動器上,從而獲益。爲此,請在第二個驅動器上創建一個表空間,並在創建表語句中添加一個TABLESPACE子句。

CREATE TABLE feed_03_tmp 
    TABLESPACE my_temp_tablespace 
    AS SELECT * FROM feed_03; 

BTW:PostgreSQL的開發與引入多線程嘗試,但它得到廣泛應用,並使其成爲一個版本,它可能會需要一段時間。

相關問題