2017-03-02 85 views
1

的Postgres 9.6並行查詢不走; Centos 6.7; 24芯的Postgres 9.6:max_parallel_workers_per_gather設置

BigTable1含有15億行;重量180GB。

max_worker_processes = 20 
max_parallel_workers_per_gather = 12 

1) 當運行

EXPLAIN 
SELECT 
    date_id, id1, id2, id3, id4, topdomain, ftype, SUM(imps), SUM(cls) 
FROM BigTable1 
WHERE 
    date_id BETWEEN 2017021200 AND 2017022400    
    AND date_id BETWEEN 2017020000 AND 2017029999 
GROUP BY 
date_id, id1, id2, id3, id4, topdomain, ftype; 

無「工人計劃:」在所有使用。爲什麼?

2) 當運行相同的查詢時在會話中定義

set max_parallel_workers_per_gather = 5; 

「工人計劃:5」出現。執行時間僅提高了25%。

2.1)爲什麼「工人計劃:」只出現在這之後設置? 2.2)爲什麼我們在用max_parallel_workers_per_gather = 5運行時看不到更好的改進?

謝謝!

+0

什麼樣的你有硬件嗎?多少個驅動器?什麼類型的驅動器?你的驅動器速度有多快?那麼RAM呢?等等。 –

回答

3

當PostgreSQL考慮並行順序掃描時,它根據關係大小(或驅動表的parallel_workers存儲參數)確定應該使用多少個工人,並計算具有該工作人數的並行計劃的成本。這與串行計劃的成本相比,便宜的計劃獲勝。沒有考慮與其他員工數量的計劃,因此可能發生的情況是,連續計劃的成本低於所考慮計劃的成本,但會超過某些計劃中具有不同數量工人的成本。這可能發生在你的情況。

既然你沒有貼EXPLAIN ANALYZE輸出,我們無法看到您的查詢是多少組生產,但我的猜測是,這是一個相當大的數字。在PostgreSQL 9.6,並行骨料必須由每個工人(一個PartialAggregate)聚集所述數據的一個部分,然後合併使用相同的按鍵組中的前導序列(一個FinalizeAggregate)來執行。在這兩個步驟之間,需要一個聚集節點將來自工人的部分分組數據傳輸給領導。這個聚集節點有點貴,所以你看到只有有限的加速的最可能的原因是正在傳輸的組數很大。發送所有這些團體和合併發生在多個工作組的成本,可能會顯得過高,具有較高的工人證明的並行性,但可能看起來像一個較低的工人的勝利。這些相同的成本可能是因爲即使使用並行查詢時,您看到的速度也只有25%。

如果您在有和沒有並行查詢的情況下發布EXPLAIN ANALYZE輸出(也就是說,使用「Workers Planned:5」並且沒有並行性),可能會更清楚地瞭解您的案例中發生了什麼。

(來源:我的PostgreSQL的並行查詢支持的主要作者之一)

0

如果你只是測試並行查詢位,然後你可以看一下force_parallel_mode並把它置上。

force_parallel_mode(ENUM)

允許甚至在 情況下,沒有性能優勢,預計使用並行查詢的用於測試目的。允許值 force_parallel_mode是關閉的(僅在預期可提高性能的 時使用並行模式),on(強制並行查詢所有 查詢被認爲是安全的),以及回退(如開啓,但是 其他行爲更改如下所述)。

而且,正如robert-haas下文提到的,如果沒有force_parallel_mode優化器將可能決定並行查詢是不是最快的......看到下面的PARAMS:

select 
    name, 
    setting, 
    unit, 
    short_desc 
from pg_settings 
where name in (
    'force_parallel_mode', 
    'min_parallel_relation_size', 
    'parallel_setup_cost', 
    'parallel_tuble_cost', 
    'max_parallel_workers_per_gather') 
    limit 10 ; 

postgres=> 
---------------------------------+---------+------+--------------------------------------------------------------------------------------------- 
force_parallel_mode    | off  |  | Forces use of parallel query facilities. 
max_parallel_workers_per_gather | 0  |  | Sets the maximum number of parallel processes per executor node. 
min_parallel_relation_size  | 1024 | 8kB | Sets the minimum size of relations to be considered for parallel scan. 
parallel_setup_cost    | 1000 |  | Sets the planner's estimate of the cost of starting up worker processes for parallel query. 
(4 rows)