Hi!
I have two tables with some indices on them:
CREATE TABLE subscriber
(
id serial NOT NULL,
anumber character varying(32) NOT NULL,
CONSTRAINT subscriber_pk PRIMARY KEY (id)
)
CREATE INDEX anumber_idx_numeric
ON subscriber
USING btree
(anumber::numeric);
CREATE TABLE output_message_log
(
id serial NOT NULL,
subscriber_id integer NOT NULL,
crd timestamp without time zone NOT NULL DEFAULT now(),
CONSTRAINT output_message_log_pk PRIMARY KEY (id),
CONSTRAINT subscriber_fk FOREIGN KEY (subscriber_id)
REFERENCES subscriber (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
)
CREATE INDEX crd_idx
ON output_message_log
USING btree
(crd);
CREATE INDEX subscriber_id_idx
ON output_message_log
USING btree
(subscriber_id);
I would like to run a query like this one:
select l.id
from output_message_log l join subscriber s on l.subscriber_id = s.id
where s.anumber::numeric = 5555555555
order by l.crd desc
limit 41
offset 20
The thing I do not understand is why postgresql wants to use crd_idx:
"Limit (cost=4848.58..14788.18 rows=41 width=12) (actual
time=7277.115..8583.814 rows=41 loops=1)"
" -> Nested Loop (cost=0.00..1195418.42 rows=4931 width=12)
(actual time=92.083..8583.713 rows=61 loops=1)"
" -> Index Scan Backward using crd_idx on output_message_log
l (cost=0.00..17463.80 rows=388646 width=16) (actual
time=0.029..975.095 rows=271447 loops=1)"
" -> Index Scan using subscriber_pk on subscriber s
(cost=0.00..3.02 rows=1 width=4) (actual time=0.026..0.026 rows=0
loops=271447)"
" Index Cond: ("outer".subscriber_id = s.id)"
" Filter: ((anumber)::numeric = 36308504669::numeric)"
"Total runtime: 8584.016 ms"
I would like postgresql to use subscriber_id_idx which resulst in a far less execution
time on this database.
I tried to lower random_page_cost, but that didn't help as an index is
already used, just not the "good" one.
Could you please comment on this issue and suggest some possible
soulutions?
Thanks,
Zizi