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

Reply via email to