This project is archived and is in readonly mode.
AR and postgres performace issue
Reported by Daniel Podlejski | July 17th, 2008 @ 05:13 PM | in 2.x
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
Comments and changes to this ticket
-
josh October 23rd, 2008 @ 04:32 PM
- State changed from new to invalid
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>