Tweak labeling of plan qual conditions for more consistency.
This commit is contained in:
parent
7100cbc1c4
commit
ea10ec1b69
@ -1,5 +1,5 @@
|
||||
<!--
|
||||
$Header: /cvsroot/pgsql/doc/src/sgml/perform.sgml,v 1.19 2002/03/24 04:31:05 tgl Exp $
|
||||
$Header: /cvsroot/pgsql/doc/src/sgml/perform.sgml,v 1.20 2002/03/24 17:11:37 tgl Exp $
|
||||
-->
|
||||
|
||||
<chapter id="performance-tips">
|
||||
@ -116,7 +116,7 @@ SELECT * FROM pg_class WHERE relname = 'tenk1';
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Now let's modify the query to add a qualification clause:
|
||||
Now let's modify the query to add a WHERE condition:
|
||||
|
||||
<programlisting>
|
||||
regression=# EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 1000;
|
||||
@ -142,14 +142,14 @@ regression=# EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 1000;
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Modify the query to restrict the qualification even more:
|
||||
Modify the query to restrict the condition even more:
|
||||
|
||||
<programlisting>
|
||||
regression=# EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 50;
|
||||
QUERY PLAN
|
||||
-------------------------------------------------------------------------------
|
||||
Index Scan using tenk1_unique1 on tenk1 (cost=0.00..179.33 rows=49 width=148)
|
||||
Index Filter: (unique1 < 50)
|
||||
Index Cond: (unique1 < 50)
|
||||
</programlisting>
|
||||
|
||||
and you will see that if we make the WHERE condition selective
|
||||
@ -161,7 +161,7 @@ regression=# EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 50;
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Add another condition to the qualification:
|
||||
Add another clause to the WHERE condition:
|
||||
|
||||
<programlisting>
|
||||
regression=# EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 50 AND
|
||||
@ -169,7 +169,7 @@ regression-# stringu1 = 'xxx';
|
||||
QUERY PLAN
|
||||
-------------------------------------------------------------------------------
|
||||
Index Scan using tenk1_unique1 on tenk1 (cost=0.00..179.45 rows=1 width=148)
|
||||
Index Filter: (unique1 < 50)
|
||||
Index Cond: (unique1 < 50)
|
||||
Filter: (stringu1 = 'xxx'::name)
|
||||
</programlisting>
|
||||
|
||||
@ -193,10 +193,10 @@ regression-# AND t1.unique2 = t2.unique2;
|
||||
Nested Loop (cost=0.00..327.02 rows=49 width=296)
|
||||
-> Index Scan using tenk1_unique1 on tenk1 t1
|
||||
(cost=0.00..179.33 rows=49 width=148)
|
||||
Index Filter: (unique1 < 50)
|
||||
Index Cond: (unique1 < 50)
|
||||
-> Index Scan using tenk2_unique2 on tenk2 t2
|
||||
(cost=0.00..3.01 rows=1 width=148)
|
||||
Index Filter: ("outer".unique2 = t2.unique2)
|
||||
Index Cond: ("outer".unique2 = t2.unique2)
|
||||
</programlisting>
|
||||
</para>
|
||||
|
||||
@ -208,7 +208,7 @@ regression-# AND t1.unique2 = t2.unique2;
|
||||
affect row count of the outer scan. For the inner scan, the unique2 value of the
|
||||
current
|
||||
outer-scan tuple is plugged into the inner index scan
|
||||
to produce an index qualification like
|
||||
to produce an index condition like
|
||||
<literal>t2.unique2 = <replaceable>constant</replaceable></literal>. So we get the
|
||||
same inner-scan plan and costs that we'd get from, say, <literal>explain select
|
||||
* from tenk2 where unique2 = 42</literal>. The costs of the loop node are then set
|
||||
@ -246,7 +246,7 @@ regression-# AND t1.unique2 = t2.unique2;
|
||||
-> Hash (cost=179.33..179.33 rows=49 width=148)
|
||||
-> Index Scan using tenk1_unique1 on tenk1 t1
|
||||
(cost=0.00..179.33 rows=49 width=148)
|
||||
Index Filter: (unique1 < 50)
|
||||
Index Cond: (unique1 < 50)
|
||||
</programlisting>
|
||||
|
||||
This plan proposes to extract the 50 interesting rows of <classname>tenk1</classname>
|
||||
@ -279,11 +279,11 @@ regression-# WHERE t1.unique1 < 50 AND t1.unique2 = t2.unique2;
|
||||
-> Index Scan using tenk1_unique1 on tenk1 t1
|
||||
(cost=0.00..179.33 rows=49 width=148)
|
||||
(actual time=0.63..8.91 rows=50 loops=1)
|
||||
Index Filter: (unique1 < 50)
|
||||
Index Cond: (unique1 < 50)
|
||||
-> Index Scan using tenk2_unique2 on tenk2 t2
|
||||
(cost=0.00..3.01 rows=1 width=148)
|
||||
(actual time=0.29..0.32 rows=1 loops=50)
|
||||
Index Filter: ("outer".unique2 = t2.unique2)
|
||||
Index Cond: ("outer".unique2 = t2.unique2)
|
||||
Total runtime: 31.60 msec
|
||||
</screen>
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
<!--
|
||||
$Header: /cvsroot/pgsql/doc/src/sgml/ref/explain.sgml,v 1.18 2002/03/24 16:57:29 tgl Exp $
|
||||
$Header: /cvsroot/pgsql/doc/src/sgml/ref/explain.sgml,v 1.19 2002/03/24 17:11:37 tgl Exp $
|
||||
PostgreSQL documentation
|
||||
-->
|
||||
|
||||
@ -209,7 +209,7 @@ EXPLAIN SELECT * FROM foo WHERE i = 4;
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------------
|
||||
Index Scan using fi on foo (cost=0.00..5.98 rows=1 width=4)
|
||||
Index Filter: (i = 4)
|
||||
Index Cond: (i = 4)
|
||||
(2 rows)
|
||||
</computeroutput>
|
||||
</programlisting>
|
||||
@ -226,7 +226,7 @@ EXPLAIN SELECT sum(i) FROM foo WHERE i < 10;
|
||||
---------------------------------------------------------------------
|
||||
Aggregate (cost=23.93..23.93 rows=1 width=4)
|
||||
-> Index Scan using fi on foo (cost=0.00..23.92 rows=6 width=4)
|
||||
Index Filter: (i < 10)
|
||||
Index Cond: (i < 10)
|
||||
(3 rows)
|
||||
</computeroutput>
|
||||
</programlisting>
|
||||
|
@ -5,7 +5,7 @@
|
||||
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994-5, Regents of the University of California
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.74 2002/03/24 04:31:07 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.75 2002/03/24 17:11:36 tgl Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
@ -389,7 +389,7 @@ explain_outNode(StringInfo str, Plan *plan, Plan *outer_plan,
|
||||
{
|
||||
case T_IndexScan:
|
||||
show_scan_qual(((IndexScan *) plan)->indxqualorig, true,
|
||||
"Index Filter",
|
||||
"Index Cond",
|
||||
((Scan *) plan)->scanrelid,
|
||||
outer_plan,
|
||||
str, indent, es);
|
||||
@ -409,7 +409,7 @@ explain_outNode(StringInfo str, Plan *plan, Plan *outer_plan,
|
||||
break;
|
||||
case T_NestLoop:
|
||||
show_upper_qual(((NestLoop *) plan)->join.joinqual,
|
||||
"Join Cond",
|
||||
"Join Filter",
|
||||
"outer", OUTER, outerPlan(plan),
|
||||
"inner", INNER, innerPlan(plan),
|
||||
str, indent, es);
|
||||
@ -426,7 +426,7 @@ explain_outNode(StringInfo str, Plan *plan, Plan *outer_plan,
|
||||
"inner", INNER, innerPlan(plan),
|
||||
str, indent, es);
|
||||
show_upper_qual(((MergeJoin *) plan)->join.joinqual,
|
||||
"Join Cond",
|
||||
"Join Filter",
|
||||
"outer", OUTER, outerPlan(plan),
|
||||
"inner", INNER, innerPlan(plan),
|
||||
str, indent, es);
|
||||
@ -443,7 +443,7 @@ explain_outNode(StringInfo str, Plan *plan, Plan *outer_plan,
|
||||
"inner", INNER, innerPlan(plan),
|
||||
str, indent, es);
|
||||
show_upper_qual(((HashJoin *) plan)->join.joinqual,
|
||||
"Join Cond",
|
||||
"Join Filter",
|
||||
"outer", OUTER, outerPlan(plan),
|
||||
"inner", INNER, innerPlan(plan),
|
||||
str, indent, es);
|
||||
|
Loading…
x
Reference in New Issue
Block a user