Christopher Kings-Lynne wrote:
select * from my_table where row_num >= 50000 and row_num < 100000
   and myfunc(foo, bar);


You just create an index on myfunc(foo, bar)


only if myfunc(foo, bar) is immutable...


And if it's not then the best any database can do is to index scan row_num - so still you have no problem.

Boy, you picked a *really* bad example ;-)

The problem is that Postgres decided to filter on myfunc() *first*, and then 
filter on row_num, resulting in a query time that jumped from seconds to hours. 
 And there's no way for me to tell Postgres not to do that!

So, "you still have no problem" is exactly wrong, because Postgres picked the 
wrong plan.  Postgres decided that applying myfunc() to 10,000,000 rows was a better plan 
than an index scan of 50,000 row_nums.  So I'm screwed.

Craig

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
      choose an index scan if your joining column's datatypes do not
      match

Reply via email to