Actually table itself has ~8000 records. I don't know why does it report 42 rows, since there is not even a matching row in the table for this specific condition.. But as we all know, the universal answer for every question is 42 ;) Autovacuum is on, and I also did some vacuuming before I started to play with this query. I could implement a function into my application to replace current_user to the actual username, but it just doesn't worth it. By the way, replacing current_user to a text constant reduces cost from 255->72, so there is a significant difference. Don't you think this is actually a bug, not a feature? balazs -----Original Message----- From: Robert Haas [mailto:robertmhaas@xxxxxxxxx] Sent: Monday, January 04, 2010 10:59 PM To: Keresztury Balázs Cc: pgsql-performance@xxxxxxxxxxxxxx Subject: Re: forced sequential scan when condition has current_user 2010/1/4 Keresztury Balázs <balazs@xxxxxxxxxxxxxxxx>: > just a small question: is it normal that PostgreSQL 8.4.1 always uses > sequential scanning on any table when there is a condition having the > constant "current_user"? Of course there is a btree index set on that table, > but the DBMS just doesn't want to utilize it. When I replace current_user to > any string, the planner uses the index normally. > > I can demonstrate it with the following simple query: > > SELECT psz.kotesszam FROM projekt.projektszervezet psz WHERE > psz.felhasznalo_id = current_user; > > Explain analyze: > > "Seq Scan on projektszervezet psz (cost=0.00..255.07 rows=42 width=9)" > " Filter: ((felhasznalo_id)::name = "current_user"())" You've only got 42 rows in that table - PostgreSQL probably thinks a sequential scan will be faster. It might even be right. The thing is, PostgreSQL doesn't know at planning time what the value of current_user() will be, so the plan can't depend on that; the planner just takes its best shot. But if you provide a particular value in the query then it will look at the stats and see what seems to make the most sense for that particular value. So using one of the more commonly-occuring value in the table might produce a sequential scan, while a less common value might lead to an index scan. ...Robert -- Sent via pgsql-performance mailing list (pgsql-performance@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-performance