mirror of
https://github.com/postgres/postgres.git
synced 2025-07-23 03:21:12 +03:00
Planner speedup hacking. Avoid saving useless pathkeys, so that path
comparison does not consider paths different when they differ only in uninteresting aspects of sort order. (We had a special case of this consideration for indexscans already, but generalize it to apply to ordered join paths too.) Be stricter about what is a canonical pathkey to allow faster pathkey comparison. Cache canonical pathkeys and dispersion stats for left and right sides of a RestrictInfo's clause, to avoid repeated computation. Total speedup will depend on number of tables in a query, but I see about 4x speedup of planning phase for a sample seven-table query.
This commit is contained in:
@ -15,7 +15,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.134 2000/12/12 23:33:32 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.135 2000/12/14 22:30:42 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -1424,7 +1424,12 @@ _copyRestrictInfo(RestrictInfo *from)
|
||||
newnode->mergejoinoperator = from->mergejoinoperator;
|
||||
newnode->left_sortop = from->left_sortop;
|
||||
newnode->right_sortop = from->right_sortop;
|
||||
/* Do not copy pathkeys, since they'd not be canonical in a copied query */
|
||||
newnode->left_pathkey = NIL;
|
||||
newnode->right_pathkey = NIL;
|
||||
newnode->hashjoinoperator = from->hashjoinoperator;
|
||||
newnode->left_dispersion = from->left_dispersion;
|
||||
newnode->right_dispersion = from->right_dispersion;
|
||||
|
||||
return newnode;
|
||||
}
|
||||
|
@ -20,7 +20,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.84 2000/12/12 23:33:33 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.85 2000/12/14 22:30:42 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -515,8 +515,9 @@ _equalRestrictInfo(RestrictInfo *a, RestrictInfo *b)
|
||||
if (!equal(a->clause, b->clause))
|
||||
return false;
|
||||
/*
|
||||
* ignore eval_cost, since it may not be set yet, and should be
|
||||
* derivable from the clause anyway
|
||||
* ignore eval_cost, left/right_pathkey, and left/right_dispersion,
|
||||
* since they may not be set yet, and should be derivable from the
|
||||
* clause anyway
|
||||
*/
|
||||
if (a->ispusheddown != b->ispusheddown)
|
||||
return false;
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.101 2000/12/12 23:33:33 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.102 2000/12/14 22:30:42 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Most of the read functions for plan nodes are tested. (In fact, they
|
||||
@ -1848,6 +1848,11 @@ _readRestrictInfo(void)
|
||||
|
||||
/* eval_cost is not part of saved representation; compute on first use */
|
||||
local_node->eval_cost = -1;
|
||||
/* ditto for cached pathkeys and dispersion */
|
||||
local_node->left_pathkey = NIL;
|
||||
local_node->right_pathkey = NIL;
|
||||
local_node->left_dispersion = -1;
|
||||
local_node->right_dispersion = -1;
|
||||
|
||||
return local_node;
|
||||
}
|
||||
|
Reference in New Issue
Block a user