Re: [SQL] index usage ... strange !?

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Marten Feldtmann <marten(at)feki(dot)toppoint(dot)de>
Cc: pgsql-sql(at)postgreSQL(dot)org
Subject: Re: [SQL] index usage ... strange !?
Date: 2000-01-19 18:07:26
Message-ID: 10412.948305246@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

Marten Feldtmann <marten(at)feki(dot)toppoint(dot)de> writes:
> Ok, indeed it was the wrong statement, therefore I rewrote it to:

> SELECT P3AT.AO,P3AT.AT,P3AT.AV FROM P3AT
> WHERE
> EXISTS
> (SELECT B.AO FROM P3AT AS B WHERE B.AO=P3AT.AO AND ....)

> There're indices on AO,AT,AV. Size of table about 23000 rows.

> He uses indices only for the statement within EXISTS, which seems
> to be pretty fast but for the outer SELECT statement he uses a
> sequential scan ... which brings the the statement down from 23 ms to
> 2000ms.

> Actually I don not understand it. The "B.AO=P3AT.AO" should create
> internally a join (?) and therefore he could use the index on AO in
> the outer select to create the result - but the seq scan seems to
> be wrong.

You are right, this would be better done as a join, but the system is
not currently smart enough to rewrite a sub-SELECT into a join. You
have to do it yourself :-(.

I think preserving the semantics of this exactly would require outer
joins, which we don't yet have, but you could get close with DISTINCT:

SELECT DISTINCT A.AO,A.AT,A.AV FROM P3AT A, P3AT B
WHERE A.AO = B.AO AND ...;

Both of these issues are on the TODO list, and probably will get
addressed in a release or three...

regards, tom lane

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Tom Lane 2000-01-19 18:11:20 Re: [SQL] char(19) to varchar(32)
Previous Message Marten Feldtmann 2000-01-19 17:46:26 Re: [SQL] index usage ... strange !?