Обсуждение: Bugs in bigint indexes
Gustavo Scotti writes: > when the key is bigint, it ignores any kind of index scan, it always use > Seq scan. Why? RTFM: http://www.postgresql.org/docs/7.4/static/datatype.html#DATATYPE-INT Please don't post to pgsql-bugs unless you have found a bug.
On Wed, 17 Dec 2003, Gustavo Scotti wrote: > <http://www.axur.com.br/images/axur_animado.gif> > _____ > > > Dear developers, > > I almost got nuts those two days I'm stuck with this issue... > Let's get straight to the point. I'm using a small portion of my actual > table, but this is enough. > > CREATE SEQUENCE it_seq; > CREATE TABLE it_test ( > id bigint not null primary key default > nextval('public.it_test_id_seq'::text) > ); > > explain SELECT id FROM it_test WHERE id=123; > Seq Scan on it_test (cost=0.0..22.50 rows=2 width=8) > Filter: (id=123) > (2 rows) > > when the key is bigint, it ignores any kind of index scan, it always use > Seq scan. Why? > Try casting id to bigint, like so: explain SELECT id from it_test WHERE id = 123::bigint; (You need to do this for smallints as well). Why doesn't the query planner notice that an int-type index is present and perform the cast on its own? Perhaps one of the developers can explain? I think users would like this property if it could be implemented without breaking anything. Nishad -- "Underneath the concrete, the dream is still alive" -- Talking Heads
Nishad Prakash <prakashn@uci.edu> writes:
> Why doesn't the query planner notice that an int-type index is present
> and perform the cast on its own? Perhaps one of the developers
> can explain? I think users would like this property if it could be
> implemented without breaking anything.
It's been done for 7.5. As for why it wasn't done earlier, well, it
was a hard problem. Read the pgsql-hackers archives.
regards, tom lane
MessageTry this
explain SELECT id FROM it_test WHERE id=3D'123';
QUERY PLAN
----------------------------------------------------------------------------
Index Scan using it_test_pkey on it_test (cost=3D0.00..4.82 rows=3D1 widt=
h=3D8)
Index Cond: (id =3D 123::bigint)
(2 rows)
The point is that 123 is naturally considered by Postgres to be an int4. If=
you want to specify it is an int8 then use quotes around your value or an =
explicit cast if the sought value is some kind of int4, int2 attribute.
The same apply for smallints.
----- Original Message -----=20
From: Gustavo Scotti=20
To: pgsql-bugs@postgresql.org=20
Sent: Wednesday, December 17, 2003 8:56 PM
Subject: [BUGS] Bugs in bigint indexes
I almost got nuts those two days I'm stuck with this issue...=20
Let's get straight to the point. I'm using a small portion of my actual t=
able, but this is enough.
CREATE SEQUENCE it_seq;
CREATE TABLE it_test (
id bigint not null primary key default nextval('public.it_test_id_seq'=
::text)
);
explain SELECT id FROM it_test WHERE id=3D123;
Seq Scan on it_test (cost=3D0.0..22.50 rows=3D2 width=3D8)
Filter: (id=3D123)
(2 rows)