Re: [HACKERS] Composite index and min()

From: Merlin Moncure <mmoncure(at)gmail(dot)com>
To: Jim Nasby <Jim(dot)Nasby(at)bluetreble(dot)com>
Cc: James Sewell <james(dot)sewell(at)lisasoft(dot)com>, pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: Re: [HACKERS] Composite index and min()
Date: 2015-02-26 20:33:25
Message-ID: CAHyXU0ydG5Og7xrppEvzeZ11Gfu8tw0eb+0BB9W-6WXj1NfS4Q@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-hackers

On Thu, Feb 26, 2015 at 2:30 AM, Jim Nasby <Jim(dot)Nasby(at)bluetreble(dot)com> wrote:
> On 2/26/15 1:34 AM, James Sewell wrote:
>>
>> Hello,
>
>
> The correct place for this is pgsql-general(at)(dot) -hackers is for development of
> Postgres itself. I'm moving the discussion there.
>
>
>> I have the following table:
>>
>> \d a
>> Table "phxconfig.a"
>> Column | Type | Modifiers
>> ---------------+---------+-----------
>> phx_run_id | integer |
>> cell_id | integer |
>> Indexes:
>> "a_phx_run_id_cell_id_idx" btree (phx_run_id, cell_id)
>>
>> When I use a min() query I get the following plans:
>>
>> test=# explain select min(phx_run_id) from a;
>> QUERY PLAN
>>
>> -------------------------------------------------------------------------------------------------------
>> Result (cost=0.22..0.23 rows=1 width=0)
>> InitPlan 1 (returns $0)
>> -> Limit (cost=0.14..0.22 rows=1 width=4)
>> -> Index Only Scan using a_phx_run_id_cell_id_idx on a
>> (cost=0.14..7.89 rows=100 width=4)
>> Index Cond: (phx_run_id IS NOT NULL)
>>
>> test=# explain select min(cell_id) from a;
>> QUERY PLAN
>> ---------------------------------------------------------
>> Aggregate (cost=2.25..2.26 rows=1 width=4)
>> -> Seq Scan on a (cost=0.00..2.00 rows=100 width=4)
>>
>> Can anyone comment on why this happens?
>
>
> There's very little (if anything) that can be done when referring to the 2nd
> column in an index but not the first. (I think some bitmap stuff may be able
> to do it, but that would be pretty useless here).
>
>> The index kicks in when I do an explicit cell_id comparison.
>
>
> Please post EXPLAIN ANALYZE for that.
>
>> These are
>> large tables, and they are in a partition layout so it really hurts when
>> I do the min call on the parent table.
>
>
> Something doesn't look right in your EXPLAIN output if that table is
> supposed to be partitioned... what version are you on?

also, the planner thinks a only has 100 records which is quite a long
way from 'large tables' by any measure :-). I'm guessing OP made
scratch tables to present the problem. Unfortunately, that prevents
forensic analysis of the solution.

Take a look at 'http://explain.depesz.com/' which has an anonymizing feature.

merlin

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Tim Uckun 2015-02-26 21:54:31 Triggers and scalability in high transaction tables.
Previous Message Tong Michael 2015-02-26 20:23:20 how to do merge in postgres ("with upsert as" not supported)

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2015-02-26 20:51:07 Re: Precedence of standard comparison operators
Previous Message Tom Lane 2015-02-26 20:32:35 Re: Manipulating complex types as non-contiguous structures in-memory