*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.100 2004/12/31 22:00:23 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.101 2005/03/24 19:14:49 tgl Exp $
*
*-------------------------------------------------------------------------
*/
case RELKIND_INDEX:
case RELKIND_TOASTVALUE:
/* it has storage, ok to call the smgr */
- *pages = curpages = RelationGetNumberOfBlocks(rel);
+ curpages = RelationGetNumberOfBlocks(rel);
+
+ /*
+ * HACK: if the relation has never yet been vacuumed, use a
+ * minimum estimate of 10 pages. This emulates a desirable
+ * aspect of pre-8.0 behavior, which is that we wouldn't assume
+ * a newly created relation is really small, which saves us from
+ * making really bad plans during initial data loading. (The
+ * plans are not wrong when they are made, but if they are cached
+ * and used again after the table has grown a lot, they are bad.)
+ * It would be better to force replanning if the table size has
+ * changed a lot since the plan was made ... but we don't
+ * currently have any infrastructure for redoing cached plans at
+ * all, so we have to kluge things here instead.
+ *
+ * We approximate "never vacuumed" by "has relpages = 0", which
+ * means this will also fire on genuinely empty relations. Not
+ * great, but fortunately that's a seldom-seen case in the real
+ * world, and it shouldn't degrade the quality of the plan too
+ * much anyway to err in this direction.
+ */
+ if (curpages < 10 && rel->rd_rel->relpages == 0)
+ curpages = 10;
+
+ /* report estimated # pages */
+ *pages = curpages;
/* quick exit if rel is clearly empty */
if (curpages == 0)
{
WHERE t1.a = t2.d;
xxx | a | e
-----+---+----
+ | 0 |
| 1 | -1
| 2 | 2
- | 3 | -3
| 2 | 4
+ | 3 | -3
| 5 | -5
| 5 | -5
- | 0 |
(7 rows)
--
FROM J1_TBL INNER JOIN J2_TBL USING (i);
xxx | i | j | t | k
-----+---+---+-------+----
+ | 0 | | zero |
| 1 | 4 | one | -1
- | 2 | 3 | two | 4
| 2 | 3 | two | 2
+ | 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
- | 0 | | zero |
(7 rows)
-- Same as above, slightly different syntax
FROM J1_TBL JOIN J2_TBL USING (i);
xxx | i | j | t | k
-----+---+---+-------+----
+ | 0 | | zero |
| 1 | 4 | one | -1
- | 2 | 3 | two | 4
| 2 | 3 | two | 2
+ | 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
- | 0 | | zero |
(7 rows)
SELECT '' AS "xxx", *
FROM J1_TBL NATURAL JOIN J2_TBL;
xxx | i | j | t | k
-----+---+---+-------+----
+ | 0 | | zero |
| 1 | 4 | one | -1
- | 2 | 3 | two | 4
| 2 | 3 | two | 2
+ | 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
- | 0 | | zero |
(7 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
xxx | a | b | c | d
-----+---+---+-------+----
+ | 0 | | zero |
| 1 | 4 | one | -1
- | 2 | 3 | two | 4
| 2 | 3 | two | 2
+ | 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
- | 0 | | zero |
(7 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a);
xxx | a | b | c | d
-----+---+---+------+---
+ | 0 | | zero |
| 2 | 3 | two | 2
| 4 | 1 | four | 2
- | 0 | | zero |
(3 rows)
-- mismatch number of columns
FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a);
xxx | a | b | t | k
-----+---+---+-------+----
+ | 0 | | zero |
| 1 | 4 | one | -1
- | 2 | 3 | two | 4
| 2 | 3 | two | 2
+ | 2 | 3 | two | 4
| 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
- | 0 | | zero |
(7 rows)
--
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i);
xxx | i | j | t | i | k
-----+---+---+-------+---+----
+ | 0 | | zero | 0 |
| 1 | 4 | one | 1 | -1
- | 2 | 3 | two | 2 | 4
| 2 | 3 | two | 2 | 2
+ | 2 | 3 | two | 2 | 4
| 3 | 2 | three | 3 | -3
| 5 | 0 | five | 5 | -5
| 5 | 0 | five | 5 | -5
- | 0 | | zero | 0 |
(7 rows)
SELECT '' AS "xxx", *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k);
xxx | i | j | t | i | k
-----+---+---+------+---+---
+ | 0 | | zero | | 0
| 2 | 3 | two | 2 | 2
| 4 | 1 | four | 2 | 4
- | 0 | | zero | | 0
(3 rows)
--
FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
xxx | i | j | t | k
-----+---+---+-------+----
+ | 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
- | 3 | 2 | three | -3
| 2 | 3 | two | 4
+ | 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
- | 0 | | zero |
| | | |
| | | | 0
(9 rows)
FROM J1_TBL RIGHT JOIN J2_TBL USING (i);
xxx | i | j | t | k
-----+---+---+-------+----
+ | 0 | | zero |
| 1 | 4 | one | -1
| 2 | 3 | two | 2
- | 3 | 2 | three | -3
| 2 | 3 | two | 4
+ | 3 | 2 | three | -3
| 5 | 0 | five | -5
| 5 | 0 | five | -5
- | 0 | | zero |
| | | |
| | | | 0
(9 rows)
select f3, myaggp01a(*) from t group by f3;
f3 | myaggp01a
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggp03a(*) from t group by f3;
f3 | myaggp03a
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggp03b(*) from t group by f3;
f3 | myaggp03b
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggp05a(f1) from t group by f3;
f3 | myaggp05a
----+-----------
+ b | {1,2,3}
c | {1,2}
a | {1,2,3}
- b | {1,2,3}
(3 rows)
select f3, myaggp06a(f1) from t group by f3;
f3 | myaggp06a
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggp08a(f1) from t group by f3;
f3 | myaggp08a
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggp09a(f1) from t group by f3;
f3 | myaggp09a
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggp09b(f1) from t group by f3;
f3 | myaggp09b
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggp10a(f1) from t group by f3;
f3 | myaggp10a
----+-----------
+ b | {1,2,3}
c | {1,2}
a | {1,2,3}
- b | {1,2,3}
(3 rows)
select f3, myaggp10b(f1) from t group by f3;
f3 | myaggp10b
----+-----------
+ b | {1,2,3}
c | {1,2}
a | {1,2,3}
- b | {1,2,3}
(3 rows)
select f3, myaggp20a(f1) from t group by f3;
f3 | myaggp20a
----+-----------
+ b | {1,2,3}
c | {1,2}
a | {1,2,3}
- b | {1,2,3}
(3 rows)
select f3, myaggp20b(f1) from t group by f3;
f3 | myaggp20b
----+-----------
+ b | {1,2,3}
c | {1,2}
a | {1,2,3}
- b | {1,2,3}
(3 rows)
select f3, myaggn01a(*) from t group by f3;
f3 | myaggn01a
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggn01b(*) from t group by f3;
f3 | myaggn01b
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggn03a(*) from t group by f3;
f3 | myaggn03a
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggn05a(f1) from t group by f3;
f3 | myaggn05a
----+-----------
+ b | {1,2,3}
c | {1,2}
a | {1,2,3}
- b | {1,2,3}
(3 rows)
select f3, myaggn05b(f1) from t group by f3;
f3 | myaggn05b
----+-----------
+ b | {1,2,3}
c | {1,2}
a | {1,2,3}
- b | {1,2,3}
(3 rows)
select f3, myaggn06a(f1) from t group by f3;
f3 | myaggn06a
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggn06b(f1) from t group by f3;
f3 | myaggn06b
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggn08a(f1) from t group by f3;
f3 | myaggn08a
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggn08b(f1) from t group by f3;
f3 | myaggn08b
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggn09a(f1) from t group by f3;
f3 | myaggn09a
----+-----------
+ b | {}
c | {}
a | {}
- b | {}
(3 rows)
select f3, myaggn10a(f1) from t group by f3;
f3 | myaggn10a
----+-----------
+ b | {1,2,3}
c | {1,2}
a | {1,2,3}
- b | {1,2,3}
(3 rows)
SELECT * FROM shoelace_obsolete;
sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm
------------+----------+------------+--------+----------+-----------
- sl10 | 1000 | magenta | 40 | inch | 101.6
sl9 | 0 | pink | 35 | inch | 88.9
+ sl10 | 1000 | magenta | 40 | inch | 101.6
(2 rows)
SELECT * FROM shoelace_candelete;