Postgresql

為什麼規劃器沒有為 jsonb 類型的欄位選擇並行 seq 掃描?

  • January 30, 2017

我有一個帶有 jsonb 類型的列(filter_data)的表,我設置了

set force_parallel_mode to true
set max_parallel_workers_per_gather to 8

然後我執行

explain analyze
select
stream_packet_id
from json_stream_packet_filter
where true
and exists (select 1 from jsonb_array_elements(filter_data->'n48') elem where true and elem->>'tid' in ('12037', '12054', '19613', '110710', '118803', '8980823', '15221109', '15363353', '15384072', '15394611', '15398486', '15413724', '20214099', '20371626', '20925262', '22863147', '22870914', '22879288', '22886660', '22899828', '22912416', '22925004', '23824754', '46076357', '47440226', '47890942', '166390891', '166391968', '166555652', '166605165', '168992530', '169073613', '169102534', '175738876', '175774864', '195274646', '195986282', '198500112', '210996444', '211002625', '211012097', '211016534', '211027299', '272229190'))
and exists
(select 1
from jsonb_array_elements(filter_data->'idnt') elem
where true and elem->>'tid' in ('12037', '12054', '19613', '110710', '118803', '8980823', '15221109', '15363353', '15384072', '15394611', '15398486', '15413724', '20214099', '20371626', '20925262', '22863147', '22870914', '22879288', '22886660', '22899828', '22912416', '22925004', '23824754', '46076357', '47440226', '47890942', '166390891', '166391968', '166555652', '166605165', '168992530', '169073613', '169102534', '175738876', '175774864', '195274646', '195986282', '198500112', '210996444', '211002625', '211012097', '211016534', '211027299', '272229190')
and exists
(select 1 from jsonb_array_elements(elem->'rslts') elem2
where true  and (elem2->>'p')::float between 50.0 and 100.0 and elem2->>'eid' in ('203219647')limit 1
))

並且不使用並行 seq 掃描。所以問題是:為什麼?

並非所有可以想像的並行化實際上都已並行實現。子計劃是尚未完成的事情之一。

人們正在為版本 10(下一個主要版本)開發此功能,一些初步測試表明它將有助於您的查詢。目前尚不清楚該提議的程式碼是否會進入 v10。如果您想增加機會,您可以通過查看建議的更改或編譯和測試來提供幫助。它肯定會比對我們發誓更有成效。

您還可以嘗試重寫查詢以首先不使用存在(子查詢)。這將允許 v9.6 中的並行查詢,並且無論它是否是並行的,都可能更快。像這樣的東西允許在減少的集合上並行,我不知道你的完整查詢的速度是多少:

and filter_data->'n48' @> ANY(ARRAY['[{"tid":12037}]'::jsonb,'[{"tid":4}]'::jsonb]);

但我可能會質疑 JSONB 是否是保存數據的正確格式。

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