2009-12-14 67 views
0

我一直在閱讀一些關於postgres內存分配配置的文檔,但需要一些幫助。postgres內存分配調整

我的進程運行數千個SELECT SUM(x) FROM tbl WHERE ???類型查詢,其中一些需要10-30秒才能運行。在某些情況下,這些查詢的總和是多天。

除此之外,我有一個填充從原料表彙總表的形式幾條語句:INSERT INTO sum_tbl SELECT FROM raw_tbl WHERE ??? GROUP BY ???

因爲原始表都相當大(高達4000萬行),這些彙總查詢可能需要幾個小時才能跑。

該進程是單線程的,因此一次只能運行一個查詢,但是我一次運行多達4個進程,這意味着只有1-4個併發連接。

該電腦有3.2 GB RAM,其中大部分是免費的。

考慮到這一切,哪些內存設置最適用?

我的理解是work_mem看起來最相關。

謝謝。

編輯 - 添加哪些相似的查詢,查詢運行的分析1053000次

"Nested Loop (cost=0.00..62869.18 rows=6 width=17) (actual time=1812.655..32761.845 rows=30 loops=1)" 
" -> Seq Scan on table2 tt (cost=0.00..1103.74 rows=2212 width=5) (actual time=0.017..29.231 rows=1527 loops=1)" 
"  Filter: (pp AND (dd = 1200::numeric) AND ((type)::text = 'setup'::text))" 
" -> Index Scan using idx_table1 on table1 t (cost=0.00..27.91 rows=1 width=20) (actual time=21.432..21.432 rows=0 loops=1527)" 
"  Index Cond: ((t.t_id = tt.id) AND (t.st = 520000::numeric) AND (t.ta = 2300000::numeric))" 
"  Filter: (date_trunc('month'::text, t.start) = '2004-03-01 00:00:00'::timestamp without time zone)" 
"Total runtime: 32761.983 ms" 

回答

2
  1. work_mem 相關。不過,請記住它是每個操作。
  2. 確保您需要索引到位。
  3. 解釋分析是你的朋友。你可以在這裏發佈嗎?
  4. 磁盤設置(物理)在這裏很重要。如果你可以使用更多的錠子,使用它們。
  5. 最好的文檔都一如既往,herehere (if you write a lot)
  6. (勇敢的感覺),你確定你需要一個RDBMS在這裏?

編輯

在下面的評論的一些思考和討論之後,除「投入更多的硬件」唯一合理的建議是「數據倉庫」,這意味着:

  • 構建數據集市 - 帶有一個或多個聚合表 - 它將滿足您的報告需求

  • 建立ETL流程以允許增量d ata市場更新。

(但我不能說,如果這是你的問題的描述可能築底 - 這需要更深入的分析,特別是這些查詢的業務含義)

+2

只是要非常清楚 - work_mem是*不是*每個連接,它是每個*操作*。所以每個連接可能會有超過1 x work_mem。 – 2009-12-14 14:18:05

+0

1.碰到work_mem高達10Mb,2.我認爲我有,3.上面添加的問題,4.我們正在努力獲得新硬件的訪問權限,但目前在單個SATA磁盤上,5. thx,6。跆拳道?很確定我沒有替代品。 – pstanton 2009-12-14 19:53:04

+0

增加work_mem是否有可能減慢處理速度,即使它沒有達到交換點?我只使用我的記憶的第三,但如果有什麼我注意到放緩! – pstanton 2009-12-17 09:40:50