Обсуждение: Surprising sequence scan when function call used

Поиск
Список
Период
Сортировка

Surprising sequence scan when function call used

От
"Will Fitzgerald"
Дата:
I have a table, login, which has a field by the same name; there's an index
on that field. I was surprised to discover that a SELECT which compares the
login field to a constant uses an Index scan, but if it is compared to a
function call--for example, lower()--a sequence scan is forced.

Any idea why?

Here are more details:


vdsq=> select version();                              version
---------------------------------------------------------------------PostgreSQL 7.0.2 on i686-pc-linux-gnu, compiled by
gccegcs-2.91.66
 
(1 row)

vdsq=> \d login                               Table "login" Attribute   |    Type     |                    Modifier
--------------+-------------+-----------------------------------------------
-id           | integer     | not null default nextval('login_id_seq'::text)login        | char(8)     | not
nullpassword    | char(8)     | not nulljobid        | integer     | not nulltype         | smallint    | not
nullentryid     | integer     |lastactivity | timestamp   |trackid      | varchar(50) |roundid      | integer     |
 
Indices: idx_login_entryid,        idx_login_jobid,        idx_login_login,        idx_login_password,
idx_login_type,       login_pkey
 

vdsq=> explain select * from login where login.login = 'foo';
NOTICE:  QUERY PLAN:

Index Scan using idx_login_login on login  (cost=0.00..582.61 rows=609
width=62)

EXPLAIN
vdsq=> explain select * from login where login.login = lower('foo');
NOTICE:  QUERY PLAN:

Seq Scan on login  (cost=0.00..1361.86 rows=609 width=62)

EXPLAIN



Re: Surprising sequence scan when function call used

От
Tom Lane
Дата:
"Will Fitzgerald" <fitzgerald@inetmi.com> writes:
> vdsq=> explain select * from login where login.login = lower('foo');

> Seq Scan on login  (cost=0.00..1361.86 rows=609 width=62)

7.0 is a little bit stupid about cross-data-type comparisons (lower()
yields text, not char(n)).  This example works OK in current sources,
but until 7.1 comes out you'll need to write something likewhere login.login = lower('foo')::char;
Or change the login field to type text...
        regards, tom lane


Re: Surprising sequence scan when function call used

От
Hosokawa Tetsuichi
Дата:
see
functional index

On Wed, 25 Oct 2000 13:26:51 -0400
"Will Fitzgerald" <fitzgerald@inetmi.com> wrote:

> I have a table, login, which has a field by the same name; there's an index
> on that field. I was surprised to discover that a SELECT which compares the
> login field to a constant uses an Index scan, but if it is compared to a
> function call--for example, lower()--a sequence scan is forced.
> 
> Any idea why?
--
* Hosokawa Tetsuichi
* hosokawa@good-day.co.jp