From: | "Mathias Seiler" <mathias(dot)seiler(at)gmail(dot)com> |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | BUG #4656: Indexes not used when comparing nextval() and currval() to integers |
Date: | 2009-02-16 02:18:20 |
Message-ID: | 200902160218.n1G2IK9N020863@wwwmaster.postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
The following bug has been logged online:
Bug reference: 4656
Logged by: Mathias Seiler
Email address: mathias(dot)seiler(at)gmail(dot)com
PostgreSQL version: 8.3.6
Operating system: Debian Linux Lenny (testing)
Description: Indexes not used when comparing nextval() and currval()
to integers
Details:
Hello there
I'm not sure if I'm doing something terribly wrong here, but I when I
noticed a slowdown during a large transaction I dig into the problem and
found that when I use this prepared statement:
UPDATE booking_entries SET date = ? where id =
currval('booking_entries_id_seq'::regclass);
The index over the column "id" is not used. This obviously results in a full
table scan, which gets very slow after a few thousand entries.
So I tried to cast the returning value from currval() to integer (which is
the same type of id) but this still doesn't use the index (which is there):
EXPLAIN UPDATE booking_entries SET booking_date = now() where id =
nextval('booking_entries_id_seq'::regclass)::int4;
QUERY PLAN
-------------------------------------------------------------------------
Seq Scan on booking_entries (cost=0.00..351.95 rows=1 width=89)
Filter: (id = (nextval('booking_entries_id_seq'::regclass))::integer)
(2 rows)
set enable_seqscan = false;
SET
EXPLAIN UPDATE booking_entries SET booking_date = now() where id =
nextval('booking_entries_id_seq'::regclass)::int4;
QUERY PLAN
----------------------------------------------------------------------------
----
Seq Scan on booking_entries (cost=100000000.00..100000163.01 rows=1
width=89)
Filter: (id = (nextval('booking_entries_id_seq'::regclass))::integer)
(2 rows)
EXPLAIN UPDATE booking_entries SET booking_date = now() where id = 1;
QUERY PLAN
----------------------------------------------------------------------------
-----------------
Index Scan using booking_entries_pkey on booking_entries (cost=0.00..8.28
rows=1 width=89)
Index Cond: (id = 1)
(2 rows)
What's going wrong? Could this be a bug?
Kind Regards
P.S.
SELECT version();
version
----------------------------------------------------------------------------
----------------
PostgreSQL 8.3.6 on i486-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian
4.3.3-3) 4.3.3
(1 row)
uname -s -r -v -m -o
Linux 2.6.26-1-686 #1 SMP Mon Dec 15 18:15:07 UTC 2008 i686 GNU/Linux
From | Date | Subject | |
---|---|---|---|
Next Message | Fujii Masao | 2009-02-16 07:10:48 | BUG #4657: mod() makes a mistake in calculation in v8.3 |
Previous Message | David Newall | 2009-02-16 00:14:36 | Re: Lost search_path after transaction fails |