From: | Greg Stark <gsstark(at)mit(dot)edu> |
---|---|
To: | Jared Carr <jared(at)89glass(dot)com> |
Cc: | Greg Stark <gsstark(at)mit(dot)edu>, pgsql-performance(at)postgresql(dot)org |
Subject: | Re: A question on the query planner |
Date: | 2003-12-02 22:32:11 |
Message-ID: | 87ptf697h0.fsf@stark.dyndns.tv |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
Jared Carr <jared(at)89glass(dot)com> writes:
> Greg Stark wrote:
>
> > Well it looks like you have something strange going on. What data type is
> > car_id in each table?
> >
> car_id is a varchar(10) in both tables.
Huh. The following shows something strange. It seems joining on two varchars
no longer works well. Instead the optimizer has to convert both columns to
text.
I know some inter-type comparisons were removed a while ago, but I would not
have thought that would effect varchar-varchar comparisons. I think this is
pretty bad.
test=# create table a (x varchar primary key);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "a_pkey" for table "a"
CREATE TABLE
test=# create table b (x varchar primary key);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "b_pkey" for table "b"
CREATE TABLE
test=# select * from a,b where a.x=b.x;
x | x
---+---
(0 rows)
test=# explain select * from a,b where a.x=b.x;
QUERY PLAN
------------------------------------------------------------------
Merge Join (cost=139.66..159.67 rows=1001 width=64)
Merge Cond: ("outer"."?column2?" = "inner"."?column2?")
-> Sort (cost=69.83..72.33 rows=1000 width=32)
Sort Key: (a.x)::text
-> Seq Scan on a (cost=0.00..20.00 rows=1000 width=32)
-> Sort (cost=69.83..72.33 rows=1000 width=32)
Sort Key: (b.x)::text
-> Seq Scan on b (cost=0.00..20.00 rows=1000 width=32)
(8 rows)
test=# create table a2 (x text primary key);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "a2_pkey" for table "a2"
CREATE TABLE
test=# create table b2 (x text primary key);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "b2_pkey" for table "b2"
CREATE TABLE
test=# explain select * from a2,b2 where a2.x=b2.x;
QUERY PLAN
-------------------------------------------------------------------
Hash Join (cost=22.50..57.51 rows=1001 width=64)
Hash Cond: ("outer".x = "inner".x)
-> Seq Scan on a2 (cost=0.00..20.00 rows=1000 width=32)
-> Hash (cost=20.00..20.00 rows=1000 width=32)
-> Seq Scan on b2 (cost=0.00..20.00 rows=1000 width=32)
(5 rows)
--
greg
From | Date | Subject | |
---|---|---|---|
Next Message | Greg Stark | 2003-12-02 22:43:34 | Re: A question on the query planner |
Previous Message | Neil Conway | 2003-12-02 21:57:27 | Re: cross table indexes or something? |