Thread: index not used when using function

index not used when using function

From
Shiar
Date:
Hi all, a small question:

I've got this table "songs" and an index on column artist.  Since there's about
one distinct artist for every 10 rows, it would be nice if it could use this
index when counting artists.  It doesn't however:

lyrics=> EXPLAIN ANALYZE SELECT count(DISTINCT artist) FROM songs;
 Aggregate  (cost=31961.26..31961.26 rows=1 width=14) (actual time=808.863..808.864 rows=1 loops=1)
   ->  Seq Scan on songs  (cost=0.00..31950.41 rows=4341 width=14) (actual time=26.801..607.172 rows=25207 loops=1)
 Total runtime: 809.106 ms

Even with enable_seqscan to off, it just can't seem to use the index.  The same
query without the count() works just fine:

lyrics=> EXPLAIN ANALYZE SELECT DISTINCT artist FROM songs;
 Unique  (cost=0.00..10814.96 rows=828 width=14) (actual time=0.029..132.903 rows=3280 loops=1)
   ->  Index Scan using songs_artist_key on songs  (cost=0.00..10804.11 rows=4341 width=14) (actual time=0.027..103.448
rows=25207loops=1) 
 Total runtime: 135.697 ms

Of course I can just take the number of rows from the latter query, but I'm
still wondering why it can't use indexes with functions.

Thanks
--
Shiar - http://www.shiar.org
> Faktoj estas malamik del verajh

Re: index not used when using function

From
Pierre-Frédéric Caillaud
Date:
    Maybe add an order by artist to force a groupaggregate ?


> Hi all, a small question:
>
> I've got this table "songs" and an index on column artist.  Since
> there's about
> one distinct artist for every 10 rows, it would be nice if it could use
> this
> index when counting artists.  It doesn't however:
>
> lyrics=> EXPLAIN ANALYZE SELECT count(DISTINCT artist) FROM songs;
>  Aggregate  (cost=31961.26..31961.26 rows=1 width=14) (actual
> time=808.863..808.864 rows=1 loops=1)
>    ->  Seq Scan on songs  (cost=0.00..31950.41 rows=4341 width=14)
> (actual time=26.801..607.172 rows=25207 loops=1)
>  Total runtime: 809.106 ms
>
> Even with enable_seqscan to off, it just can't seem to use the index.
> The same
> query without the count() works just fine:
>
> lyrics=> EXPLAIN ANALYZE SELECT DISTINCT artist FROM songs;
>  Unique  (cost=0.00..10814.96 rows=828 width=14) (actual
> time=0.029..132.903 rows=3280 loops=1)
>    ->  Index Scan using songs_artist_key on songs  (cost=0.00..10804.11
> rows=4341 width=14) (actual time=0.027..103.448 rows=25207 loops=1)
>  Total runtime: 135.697 ms
>
> Of course I can just take the number of rows from the latter query, but
> I'm
> still wondering why it can't use indexes with functions.
>
> Thanks