I have a query in my application that runs very fast when there are large number of rows in my tables. But when the number of rows is a moderate size (neither large nor small) – the same query runs as much as 15 times slower.
The explain plan shows that the query on a medium sized data set is using nested loops for its join algorithm. The large data set uses hashed joins.
I can discourage the query planner from using nested loops either at the database level (postgresql.conf) or per session (SET enable_nestloop TO off).
What are the potential pitfalls of set enable_nestloop to off?
Other info: PostgreSQL 8.2.6, running on Windows.
This means that you will never be able to use indexes efficiently.
And it seems that you don’t use them now.
The query like this:
will most probably use
NESTED LOOPSwith anINDEX SCANonuser.idand anINDEX SCANonprofile.id, provided that you have built indices on these fields.Queries with low selectivity filters (that is, queries that need more than
10%of data from tables they use) will benefit fromMERGE JOINSandHASH JOINS.But the queries like one given above require
NESTED LOOPSto run efficiently.If you post your queries and table definitions here, probably much may be done about the indexes and queries performance.