Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

This project is archived and is in readonly mode.

AR and postgres performace issue

#644

Using of unquoted values in find(id) may cause long seq scan on huge tables.

For example:

cvalley_dev=# EXPLAIN SELECT * FROM messages WHERE (messages."id" = 111111);

QUERY PLAN

-------------------------------------------------------------------------------

Index Scan using messages_pkey on messages (cost=0.00..8.35 rows=1 width=51)

Index Cond: (id = 111111)

(2 rows)

It's OK, but:

cvalley_dev=# EXPLAIN SELECT * FROM messages WHERE (messages."id" = 111111111111111111111111);

QUERY PLAN

----------------------------------------------------------------

Seq Scan on messages (cost=0.00..23400.56 rows=4588 width=51)

Filter: ((id)::numeric = 111111111111111111111111::numeric)

(2 rows)

Postgres cast ID to numeric, so can't use integer index.

When table is really huge, this can kill our database server.

Solution on AR level is to use quoted values:

cvalley_dev=# EXPLAIN SELECT * FROM messages WHERE (messages."id" = '111111');

QUERY PLAN

-------------------------------------------------------------------------------

Index Scan using messages_pkey on messages (cost=0.00..8.35 rows=1 width=51)

Index Cond: (id = 111111)

(2 rows)

cvalley_dev=# EXPLAIN SELECT * FROM messages WHERE (messages."id" = '111111111111111111111111');

ERROR: value "111111111111111111111111" is out of range for type integer

Reported by Daniel Podlejski · July 17th, 2008 @ 05:13 PM

State: invalid
Milestone: 2.x
Assigned to: nobody
Importance: none

Activity

  1. josh
    josh
    • State changed from new to invalid

    October 23rd, 2008 @ 04:32 PM