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

Commit54f7f62

Browse files
committed
Fix thinko: cost_mergejoin must pay attention to which side of the
mergeclause is which when extracting selectivity info.
1 parented6986d commit54f7f62

File tree

1 file changed

+29
-14
lines changed

1 file changed

+29
-14
lines changed

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

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
* Portions Copyright (c) 1994, Regents of the University of California
4343
*
4444
* IDENTIFICATION
45-
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.81 2002/03/0106:01:19 tgl Exp $
45+
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.82 2002/03/0120:50:20 tgl Exp $
4646
*
4747
*-------------------------------------------------------------------------
4848
*/
@@ -467,10 +467,11 @@ cost_sort(Path *path, Query *root,
467467
}
468468

469469
/*
470-
* Note: should we bother to assign a nonzero run_cost to reflect the
471-
* overhead of extracting tuples from the sort result?Probably not
472-
* worth worrying about.
470+
* Also charge a small amount (arbitrarily set equal to operator cost)
471+
* per extracted tuple.
473472
*/
473+
run_cost+=cpu_operator_cost*tuples;
474+
474475
path->startup_cost=startup_cost;
475476
path->total_cost=startup_cost+run_cost;
476477
}
@@ -567,11 +568,12 @@ cost_mergejoin(Path *path, Query *root,
567568
Costrun_cost=0;
568569
Costcpu_per_tuple;
569570
RestrictInfo*firstclause;
571+
Var*leftvar;
570572
doubleouter_rows,
571573
inner_rows;
572574
doublentuples;
573-
Selectivityleftscan,
574-
rightscan;
575+
Selectivityouterscansel,
576+
innerscansel;
575577
Pathsort_path;/* dummy for result of cost_sort */
576578

577579
if (!enable_mergejoin)
@@ -592,11 +594,24 @@ cost_mergejoin(Path *path, Query *root,
592594
mergejoinscansel(root, (Node*)firstclause->clause,
593595
&firstclause->left_mergescansel,
594596
&firstclause->right_mergescansel);
595-
leftscan=firstclause->left_mergescansel;
596-
rightscan=firstclause->right_mergescansel;
597597

598-
outer_rows=outer_path->parent->rows*leftscan;
599-
inner_rows=inner_path->parent->rows*rightscan;
598+
leftvar=get_leftop(firstclause->clause);
599+
Assert(IsA(leftvar,Var));
600+
if (intMember(leftvar->varno,outer_path->parent->relids))
601+
{
602+
/* left side of clause is outer */
603+
outerscansel=firstclause->left_mergescansel;
604+
innerscansel=firstclause->right_mergescansel;
605+
}
606+
else
607+
{
608+
/* left side of clause is inner */
609+
outerscansel=firstclause->right_mergescansel;
610+
innerscansel=firstclause->left_mergescansel;
611+
}
612+
613+
outer_rows=outer_path->parent->rows*outerscansel;
614+
inner_rows=inner_path->parent->rows*innerscansel;
600615

601616
/* cost of source data */
602617

@@ -616,13 +631,13 @@ cost_mergejoin(Path *path, Query *root,
616631
outer_path->parent->width);
617632
startup_cost+=sort_path.startup_cost;
618633
run_cost+= (sort_path.total_cost-sort_path.startup_cost)
619-
*leftscan;
634+
*outerscansel;
620635
}
621636
else
622637
{
623638
startup_cost+=outer_path->startup_cost;
624639
run_cost+= (outer_path->total_cost-outer_path->startup_cost)
625-
*leftscan;
640+
*outerscansel;
626641
}
627642

628643
if (innersortkeys)/* do we need to sort inner? */
@@ -635,13 +650,13 @@ cost_mergejoin(Path *path, Query *root,
635650
inner_path->parent->width);
636651
startup_cost+=sort_path.startup_cost;
637652
run_cost+= (sort_path.total_cost-sort_path.startup_cost)
638-
*rightscan;
653+
*innerscansel;
639654
}
640655
else
641656
{
642657
startup_cost+=inner_path->startup_cost;
643658
run_cost+= (inner_path->total_cost-inner_path->startup_cost)
644-
*rightscan;
659+
*innerscansel;
645660
}
646661

647662
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp