Re: Why is that index not used? - Mailing list pgsql-admin

From Michael Monnerie
Subject Re: Why is that index not used?
Date
Msg-id 200901231357.07731@zmi.at
Whole thread Raw
In response to Re: Why is that index not used?  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-admin
On Mittwoch 21 Januar 2009 Tom Lane wrote:
> > Can somebody explain me why on the last line, "dbmail_physmessage",
> > there is a seq. scan going on and no index used?
>
> Because it chose to use a hash instead.  Given the rowcounts I don't
> think that's wrong,

You mean reading 10k out of 234k entries from the table itself is
quicker than looking at the index and reading only those values needed
from the table?

> but if you want to see the other plan you can try
> setting enable_hashjoin = off (and maybe enable mergejoin = off if
> it goes to a merge join next).

Even worse:
# set enable_hashjoin = off ;
 Sort  (cost=12400.45..12427.22 rows=10707 width=36) (actual
time=922.751..934.921 rows=9935 loops=1)
   Sort Key: msg.message_idnr
   Sort Method:  quicksort  Memory: 1161kB
   ->  Merge Join  (cost=3240.39..11683.82 rows=10707 width=36) (actual
time=169.998..895.009 rows=9935 loops=1)
         Merge Cond: (pm.id = msg.physmessage_id)
         ->  Index Scan using dbmail_physmessage_pkey on
dbmail_physmessage pm  (cost=0.00..7681.79 rows=230034 width=24) (actual
time=0.026..407.428 rows=229873 loops=1)
         ->  Sort  (cost=3239.57..3266.75 rows=10874 width=28) (actual
time=43.959..68.333 rows=9935 loops=1)
               Sort Key: msg.physmessage_id
               Sort Method:  quicksort  Memory: 1161kB
               ->  Index Scan using dbmail_messages_1 on dbmail_messages
msg  (cost=0.00..2510.54 rows=10874 width=28) (actual time=2.025..23.155
rows=9935 loops=1)
                     Index Cond: (mailbox_idnr = 3241)
                     Filter: ((message_idnr >= 3196318) AND
(message_idnr <= 3619184) AND (status = ANY ('{0,1,2}'::integer[])))
 Total runtime: 946.016 ms

Then in addition:
# set enable_mergejoin = off;
 Sort  (cost=15878.43..15905.19 rows=10707 width=36) (actual
time=343.430..358.492 rows=9935 loops=1)
   Sort Key: msg.message_idnr
   Sort Method:  quicksort  Memory: 1161kB
   ->  Nested Loop  (cost=0.00..15161.79 rows=10707 width=36) (actual
time=2.040..314.101 rows=9935 loops=1)
         ->  Index Scan using dbmail_messages_1 on dbmail_messages msg
(cost=0.00..2510.54 rows=10874 width=28) (actual time=1.953..30.407
rows=9935 loops=1)
               Index Cond: (mailbox_idnr = 3241)
               Filter: ((message_idnr >= 3196318) AND (message_idnr <=
3619184) AND (status = ANY ('{0,1,2}'::integer[])))
         ->  Index Scan using dbmail_physmessage_pkey on
dbmail_physmessage pm  (cost=0.00..1.15 rows=1 width=24) (actual
time=0.016..0.018 rows=1 loops=9935)
               Index Cond: (pm.id = msg.physmessage_id)
 Total runtime: 372.209 ms

> As for your other question, the reason it likes the dbmail_messages_1
> index is probably that it's a lot smaller than dbmail_messages_7.

Sounds reasonable.

> The only thing I'm seeing that seems curious is that when forced to
> use dbmail_messages_7, it isn't using what seems to be an available
> index condition.

Yes, I simply deleted the _1 key. And I expected that _7 or _8 are used,
because they provide the same first field order, so there's no
difference in the sort order for that row. Especially since it's UNIQUE.

A general question again, because I would like to understand it:
Why can't I just delete index _1, if anyway I have
index _7 with the same field, just plus additional fields. I thought
that would be redundant:

Index _1 = mailbox_idnr
Index _7 = mailbox_idnr,status,seen_flag

So I would guess that Index _1 is redundant, and I can delete it because
the planner will use _7 instead. After all, for searching any
mailbox_idnr in that table (~234k entries) it doesn't really matter if
you use index _1 or _7, the sort is the same (if you don't care about
the other fields).

mfg zmi
--
// Michael Monnerie, Ing.BSc    -----      http://it-management.at
// Tel: 0660 / 415 65 31                      .network.your.ideas.
// PGP Key:         "curl -s http://zmi.at/zmi.asc | gpg --import"
// Fingerprint: AC19 F9D5 36ED CD8A EF38  500E CE14 91F7 1C12 09B4
// Keyserver: wwwkeys.eu.pgp.net                  Key-ID: 1C1209B4



pgsql-admin by date:

Previous
From: Gerd König
Date:
Subject: pgpool-II question
Next
From: Carol Walter
Date:
Subject: Re: ssl database connection problems...