Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit2609e91

Browse files
committed
Fix regression in parallel planning against inheritance tables.
Commit51ee6f3 accidentally changedthe behavior around inheritance hierarchies; before, we alwaysconsidered parallel paths even for very small inheritance children,because otherwise an inheritance hierarchy with even one small childwouldn't be eligible for parallelism. That exception was inadverentlyremoved; put it back.In passing, also adjust the degree-of-parallelism comptuation forindex-only scans not to consider the number of heap pages fetched.Otherwise, we'll avoid parallel index-only scans on tables that aremostly all-visible, which isn't especially logical.Robert Haas and Amit Kapila, per a report from Ashutosh Sharma.Discussion:http://postgr.es/m/CAE9k0PmgSoOHRd60SHu09aRVTHRSs8s6pmyhJKWHxWw9C_x+XA@mail.gmail.com
1 parentc11453c commit2609e91

File tree

3 files changed

+36
-25
lines changed

3 files changed

+36
-25
lines changed

‎src/backend/optimizer/path/allpaths.c

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ create_plain_partial_paths(PlannerInfo *root, RelOptInfo *rel)
692692
{
693693
intparallel_workers;
694694

695-
parallel_workers=compute_parallel_worker(rel,rel->pages,0);
695+
parallel_workers=compute_parallel_worker(rel,rel->pages,-1);
696696

697697
/* If any limit was set to zero, the user doesn't want a parallel scan. */
698698
if (parallel_workers <=0)
@@ -2938,7 +2938,7 @@ create_partial_bitmap_paths(PlannerInfo *root, RelOptInfo *rel,
29382938
pages_fetched=compute_bitmap_pages(root,rel,bitmapqual,1.0,
29392939
NULL,NULL);
29402940

2941-
parallel_workers=compute_parallel_worker(rel,pages_fetched,0);
2941+
parallel_workers=compute_parallel_worker(rel,pages_fetched,-1);
29422942

29432943
if (parallel_workers <=0)
29442944
return;
@@ -2953,16 +2953,16 @@ create_partial_bitmap_paths(PlannerInfo *root, RelOptInfo *rel,
29532953
* be scanned and the size of the index to be scanned, then choose a minimum
29542954
* of those.
29552955
*
2956-
* "heap_pages" is the number of pages from the table that we expect to scan.
2957-
* "index_pages" is the number of pages from the index that we expect to scan.
2956+
* "heap_pages" is the number of pages from the table that we expect to scan, or
2957+
* -1 if we don't expect to scan any.
2958+
*
2959+
* "index_pages" is the number of pages from the index that we expect to scan, or
2960+
* -1 if we don't expect to scan any.
29582961
*/
29592962
int
2960-
compute_parallel_worker(RelOptInfo*rel,BlockNumberheap_pages,
2961-
BlockNumberindex_pages)
2963+
compute_parallel_worker(RelOptInfo*rel,doubleheap_pages,doubleindex_pages)
29622964
{
29632965
intparallel_workers=0;
2964-
intheap_parallel_workers=1;
2965-
intindex_parallel_workers=1;
29662966

29672967
/*
29682968
* If the user has set the parallel_workers reloption, use that; otherwise
@@ -2972,23 +2972,24 @@ compute_parallel_worker(RelOptInfo *rel, BlockNumber heap_pages,
29722972
parallel_workers=rel->rel_parallel_workers;
29732973
else
29742974
{
2975-
intheap_parallel_threshold;
2976-
intindex_parallel_threshold;
2977-
29782975
/*
2979-
* If this relation is too small to be worth a parallel scan, just
2980-
* return without doing anything ... unless it's an inheritance child.
2981-
* In that case, we want to generate a parallel path here anyway. It
2982-
* might not be worthwhile just for this relation, but when combined
2983-
* with all of its inheritance siblings it may well pay off.
2976+
* If the number of pages being scanned is insufficient to justify a
2977+
* parallel scan, just return zero ... unless it's an inheritance
2978+
* child. In that case, we want to generate a parallel path here
2979+
* anyway. It might not be worthwhile just for this relation, but
2980+
* when combined with all of its inheritance siblings it may well pay
2981+
* off.
29842982
*/
2985-
if (heap_pages< (BlockNumber)min_parallel_table_scan_size&&
2986-
index_pages< (BlockNumber)min_parallel_index_scan_size&&
2987-
rel->reloptkind==RELOPT_BASEREL)
2983+
if (rel->reloptkind==RELOPT_BASEREL&&
2984+
((heap_pages >=0&&heap_pages<min_parallel_table_scan_size)||
2985+
(index_pages >=0&&index_pages<min_parallel_index_scan_size)))
29882986
return0;
29892987

2990-
if (heap_pages>0)
2988+
if (heap_pages >=0)
29912989
{
2990+
intheap_parallel_threshold;
2991+
intheap_parallel_workers=1;
2992+
29922993
/*
29932994
* Select the number of workers based on the log of the size of
29942995
* the relation. This probably needs to be a good deal more
@@ -3008,8 +3009,11 @@ compute_parallel_worker(RelOptInfo *rel, BlockNumber heap_pages,
30083009
parallel_workers=heap_parallel_workers;
30093010
}
30103011

3011-
if (index_pages>0)
3012+
if (index_pages >=0)
30123013
{
3014+
intindex_parallel_workers=1;
3015+
intindex_parallel_threshold;
3016+
30133017
/* same calculation as for heap_pages above */
30143018
index_parallel_threshold=Max(min_parallel_index_scan_size,1);
30153019
while (index_pages >= (BlockNumber) (index_parallel_threshold*3))

‎src/backend/optimizer/path/costsize.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -662,15 +662,22 @@ cost_index(IndexPath *path, PlannerInfo *root, double loop_count,
662662

663663
if (partial_path)
664664
{
665+
/*
666+
* For index only scans compute workers based on number of index pages
667+
* fetched; the number of heap pages we fetch might be so small as
668+
* to effectively rule out parallelism, which we don't want to do.
669+
*/
670+
if (indexonly)
671+
rand_heap_pages=-1;
672+
665673
/*
666674
* Estimate the number of parallel workers required to scan index. Use
667675
* the number of heap pages computed considering heap fetches won't be
668676
* sequential as for parallel scans the pages are accessed in random
669677
* order.
670678
*/
671679
path->path.parallel_workers=compute_parallel_worker(baserel,
672-
(BlockNumber)rand_heap_pages,
673-
(BlockNumber)index_pages);
680+
rand_heap_pages,index_pages);
674681

675682
/*
676683
* Fall out if workers can't be assigned for parallel scan, because in

‎src/include/optimizer/paths.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ extern RelOptInfo *standard_join_search(PlannerInfo *root, int levels_needed,
5454
List*initial_rels);
5555

5656
externvoidgenerate_gather_paths(PlannerInfo*root,RelOptInfo*rel);
57-
externintcompute_parallel_worker(RelOptInfo*rel,BlockNumberheap_pages,
58-
BlockNumberindex_pages);
57+
externintcompute_parallel_worker(RelOptInfo*rel,doubleheap_pages,
58+
doubleindex_pages);
5959
externvoidcreate_partial_bitmap_paths(PlannerInfo*root,RelOptInfo*rel,
6060
Path*bitmapqual);
6161

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp