I assume there are reasons not to throw away join to state. May be it still
can be done as the last thing. This should help further:
SELECT counts.* FROM (
   SELECT busbase.state AS state, count(busbase.id) AS m0 FROM busbase
   GROUP BY busbase.state ) AS counts
 INNER JOIN state USING (state)

Regards,
Roman Konoval


On Sun, Mar 24, 2013 at 12:27 AM, Misa Simic <misa.si...@gmail.com> wrote:

> Hi Jeff,
>
> It seems my previous mail has not showed up in the list... copied/pasted
> again belloew
>
> However, you said something important:
>
> "The join to the "state" table is not necessary.  Between the foreign key
> and the primary key, you know that every state exists, and that every state
> exists only once.  But, that will not solve your problem, as the join to
> the state table is not where the time goes."
>
> I think it is something what planner could/should be "aware off"... and
> discard the join
>
> " Merge Join  (cost=0.00..2310285.02 rows=60057056 width=3) (actual
> time=38.424..41992.070 rows=60057057 loops=1)"
> "        Merge Cond: (state.state = busbase.state)"
>
> this part from bellow plan  would save significant time if planner didn't
> decide to take this step at all ....
>
> Kind regards,
>
> Misa
>
>
>
>
> "
> Hi Cindy
>
> TBH - I don't know...
>
> I have added this to list so maybe someone else can help...
>
> To recap:
>
> from start situation (table structure and indexes are in the first mail in
> this thread)
>
> EXPLAIN ANALYZE
> SELECT busbase.state AS c0, count(busbase.id) AS m0 FROM busbase INNER
> JOIN state USING (state)
> GROUP BY busbase.state
>
> says:
> "HashAggregate  (cost=7416975.58..7416976.09 rows=51 width=7) (actual
> time=285339.465..285339.473 rows=51 loops=1)"
> "  ->  Hash Join  (cost=2.15..7139961.94 rows=55402728 width=7) (actual
> time=0.066..269527.934 rows=60057057 loops=1)"
>  "        Hash Cond: (busbase.state = state.state)"
> "        ->  Seq Scan on busbase  (cost=0.00..6378172.28 rows=55402728
> width=7) (actual time=0.022..251029.307 rows=60057057 loops=1)"
> "        ->  Hash  (cost=1.51..1.51 rows=51 width=3) (actual
> time=0.028..0.028 rows=51 loops=1)"
> "              Buckets: 1024  Batches: 1  Memory Usage: 2kB"
> "              ->  Seq Scan on state  (cost=0.00..1.51 rows=51 width=3)
> (actual time=0.003..0.019 rows=51 loops=1)"
> "Total runtime: 285339.516 ms"
>
> on created composite index
> CREATE INDEX comp_statidx2
>   ON busbase
>   USING btree
>   (state, id );
>
>
> we got:
>
> "GroupAggregate  (cost=0.00..2610570.81 rows=51 width=3) (actual
> time=98.923..51033.888 rows=51 loops=1)"
> "  ->  Merge Join  (cost=0.00..2310285.02 rows=60057056 width=3) (actual
> time=38.424..41992.070 rows=60057057 loops=1)"
> "        Merge Cond: (state.state = busbase.state)"
> "        ->  Index Only Scan using state_pkey on state  (cost=0.00..13.02
> rows=51 width=3) (actual time=0.008..0.148 rows=51 loops=1)"
> "              Heap Fetches: 51"
> "        ->  Index Only Scan using comp_statidx2 on busbase
>  (cost=0.00..1559558.68 rows=60057056 width=3) (actual
> time=38.408..12883.575 rows=60057057 loops=1)"
> "              Heap Fetches: 0"
> "Total runtime: 51045.648 ms"
>
>
> Question is - is it possible to improve it more?
>  "
> ​
>

Reply via email to