index not used?
I'm trying to access a table with about 120M rows. It's a vertical version
of a table with 360 or so columns. The new columns are: original item col,
original item row, and the value.
I created an index:
CREATE INDEX idx on table (col, row)
however, selects are still very slow. It seems it still needs a sequential
scan:
EXPLAIN SELECT * FROM table WHERE col=1 AND row=10;
QUERY PLAN
------------------------------------------------------------------------------
Seq Scan on table (cost=100000000.00..102612533.00 rows=1 width=14)
Filter: ((col = 1) AND ("row" = 10))
What am I doing wrong?
--
Dan Pelleg
On Wed, 2004-10-20 at 08:06, Dan Pelleg wrote:
I'm trying to access a table with about 120M rows. It's a vertical version
of a table with 360 or so columns. The new columns are: original item col,
original item row, and the value.I created an index:
CREATE INDEX idx on table (col, row)
however, selects are still very slow. It seems it still needs a sequential
scan:EXPLAIN SELECT * FROM table WHERE col=1 AND row=10;
QUERY PLAN
------------------------------------------------------------------------------
Seq Scan on table (cost=100000000.00..102612533.00 rows=1 width=14)
Filter: ((col = 1) AND ("row" = 10))What am I doing wrong?
What type are row and col? If they're bigint (i.e. not int / int4) then
you might need to quote the value to get the query to use an index:
SELECT * FROM table WHERE col='1' AND row='10';
also, have you vacuumed / analyzed the table? I'm assuming yes.
Scott Marlowe writes:
On Wed, 2004-10-20 at 08:06, Dan Pelleg wrote:
I'm trying to access a table with about 120M rows. It's a vertical version
of a table with 360 or so columns. The new columns are: original item col,
original item row, and the value.I created an index:
CREATE INDEX idx on table (col, row)
however, selects are still very slow. It seems it still needs a sequential
scan:EXPLAIN SELECT * FROM table WHERE col=1 AND row=10;
QUERY PLAN
------------------------------------------------------------------------------
Seq Scan on table (cost=100000000.00..102612533.00 rows=1 width=14)
Filter: ((col = 1) AND ("row" = 10))What am I doing wrong?
What type are row and col? If they're bigint (i.e. not int / int4) then
you might need to quote the value to get the query to use an index:SELECT * FROM table WHERE col='1' AND row='10';
also, have you vacuumed / analyzed the table? I'm assuming yes.
They're not bigints:
CREATE TABLE table (col int2, row integer, val double precision)
Yes, I vacuumed and analyzed, right after creating the index. Should I try
and issue a few queries beforehand?
--Dan
On Wed, 2004-10-20 at 09:45, Dan Pelleg wrote:
Scott Marlowe writes:
On Wed, 2004-10-20 at 08:06, Dan Pelleg wrote:
I'm trying to access a table with about 120M rows. It's a vertical version
of a table with 360 or so columns. The new columns are: original item col,
original item row, and the value.I created an index:
CREATE INDEX idx on table (col, row)
however, selects are still very slow. It seems it still needs a sequential
scan:EXPLAIN SELECT * FROM table WHERE col=1 AND row=10;
QUERY PLAN
------------------------------------------------------------------------------
Seq Scan on table (cost=100000000.00..102612533.00 rows=1 width=14)
Filter: ((col = 1) AND ("row" = 10))What am I doing wrong?
What type are row and col? If they're bigint (i.e. not int / int4) then
you might need to quote the value to get the query to use an index:SELECT * FROM table WHERE col='1' AND row='10';
also, have you vacuumed / analyzed the table? I'm assuming yes.
They're not bigints:
CREATE TABLE table (col int2, row integer, val double precision)
Yes, I vacuumed and analyzed, right after creating the index. Should I try
and issue a few queries beforehand?
but one is an int2 (i.e. not int / int4) so you'll need to quote that
value to get an index to work. Note this is fixed in 8.0 I understand.
Scott Marlowe writes:
On Wed, 2004-10-20 at 09:45, Dan Pelleg wrote:
Scott Marlowe writes:
On Wed, 2004-10-20 at 08:06, Dan Pelleg wrote:
I'm trying to access a table with about 120M rows. It's a vertical version
of a table with 360 or so columns. The new columns are: original item col,
original item row, and the value.I created an index:
CREATE INDEX idx on table (col, row)
however, selects are still very slow. It seems it still needs a sequential
scan:EXPLAIN SELECT * FROM table WHERE col=1 AND row=10;
QUERY PLAN
------------------------------------------------------------------------------
Seq Scan on table (cost=100000000.00..102612533.00 rows=1 width=14)
Filter: ((col = 1) AND ("row" = 10))What am I doing wrong?
What type are row and col? If they're bigint (i.e. not int / int4) then
you might need to quote the value to get the query to use an index:SELECT * FROM table WHERE col='1' AND row='10';
also, have you vacuumed / analyzed the table? I'm assuming yes.
They're not bigints:
CREATE TABLE table (col int2, row integer, val double precision)
Yes, I vacuumed and analyzed, right after creating the index. Should I try
and issue a few queries beforehand?but one is an int2 (i.e. not int / int4) so you'll need to quote that
value to get an index to work. Note this is fixed in 8.0 I understand.
Bingo.
=> explain select * from table where col='302' and row =100600400;
QUERY PLAN
---------------------------------------------------------------------
Index Scan using idx2 on table (cost=0.00..5.27 rows=1 width=14)
Index Cond: ((col = 302::smallint) AND ("row" = 100600400))
(2 rows)
=> explain select * from table where col=302 and row =100600400;
QUERY PLAN
------------------------------------------------------------------------
Seq Scan on table (cost=100000000.00..102612533.00 rows=1 width=14)
Filter: ((col = 302) AND ("row" = 100600400))
(2 rows)
Wow, that sure is a big difference for such a small "change" in the
query. Thank you very much!
Scott Marlowe wrote:
On Wed, 2004-10-20 at 08:06, Dan Pelleg wrote:
I'm trying to access a table with about 120M rows. It's a vertical version
of a table with 360 or so columns. The new columns are: original item col,
original item row, and the value.I created an index:
CREATE INDEX idx on table (col, row)
however, selects are still very slow. It seems it still needs a sequential
scan:EXPLAIN SELECT * FROM table WHERE col=1 AND row=10;
QUERY PLAN
------------------------------------------------------------------------------
Seq Scan on table (cost=100000000.00..102612533.00 rows=1 width=14)
Filter: ((col = 1) AND ("row" = 10))What am I doing wrong?
What type are row and col? If they're bigint (i.e. not int / int4) then
you might need to quote the value to get the query to use an index:SELECT * FROM table WHERE col='1' AND row='10';
also, have you vacuumed / analyzed the table? I'm assuming yes.
I assume not, seen that cost...
Regards
Gaetano Mendola
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Scott Marlowe wrote:
| On Fri, 2004-10-22 at 17:11, Gaetano Mendola wrote:
|
|>Scott Marlowe wrote:
|>
|>>On Wed, 2004-10-20 at 08:06, Dan Pelleg wrote:
|>>
|>>
|>>>I'm trying to access a table with about 120M rows. It's a vertical version
|>>>of a table with 360 or so columns. The new columns are: original item col,
|>>>original item row, and the value.
|>>>
|>>>I created an index:
|>>>
|>>>CREATE INDEX idx on table (col, row)
|>>>
|>>>however, selects are still very slow. It seems it still needs a sequential
|>>>scan:
|>>>
|>>>EXPLAIN SELECT * FROM table WHERE col=1 AND row=10;
|>>> QUERY PLAN
|>>>------------------------------------------------------------------------------
|>>>Seq Scan on table (cost=100000000.00..102612533.00 rows=1 width=14)
|>>> Filter: ((col = 1) AND ("row" = 10))
|>>>
|>>>What am I doing wrong?
|>>
|>>
|>>What type are row and col? If they're bigint (i.e. not int / int4) then
|>>you might need to quote the value to get the query to use an index:
|>>
|>>SELECT * FROM table WHERE col='1' AND row='10';
|>>
|>>also, have you vacuumed / analyzed the table? I'm assuming yes.
|>
|>I assume not, seen that cost...
|>
|
|
| Actually, that cost would likely be caused by set enable_seqscan = off
| wouldn't it?
That's true. This is the second time in these last days that I see someone "tune"
postgres setting enable_seqscan = off.
G.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (MingW32)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
iD8DBQFBeh6H7UpzwH2SGd4RAvEDAKDdBI6g484jxv4dzdMwXSRwQpJUhgCfU2W7
4hghwH7rJhsC8mRk+Uo/OsU=
=WCBg
-----END PGP SIGNATURE-----
Import Notes
Reply to msg id not found: 1098492331.21035.101.camel@localhost.localdomain