On 3/4/06, Joost Kraaijeveld <J.Kraaijeveld@xxxxxxxxxx> wrote: > Below is what I actually have. Given the fact that it takes forever to get > a result (> 6 seconds) , there must be something wrong with my solution or > my expectation. Can anyone tell what I should do to make this query go > faster ( or convince me to wait for the result ;-()? > Explain analyze after a full alayse vacuum: > Sort (cost=54710.68..54954.39 rows=97484 width=111) (actual > time=7398.971..7680.405 rows=96041 loops=1) > Sort Key: btrim(upper(customers.lastname)), btrim(upper(addresses.city)) > -> Hash Join (cost=14341.12..46632.73 rows=97484 width=111) (actual > time=1068.862..5472.788 rows=96041 loops=1) > Hash Cond: ("outer".contactaddress = "inner".objectid) > -> Seq Scan on customers (cost=0.00..24094.01 rows=227197 > width=116) (actual time=0.018..1902.646 rows=223990 loops=1) > Filter: (btrim(upper(lastname)) >= 'JANSEN'::text) > -> Hash (cost=13944.94..13944.94 rows=158473 width=75) (actual > time=1068.467..1068.467 rows=158003 loops=1) > -> Bitmap Heap Scan on addresses (cost=1189.66..13944.94 > rows=158473 width=75) (actual time=71.259..530.986 rows=158003 loops=1) > Recheck Cond: (btrim(upper(city)) >= 'NIJMEGEN'::text) > -> Bitmap Index Scan on > prototype_addresses_trim_upper_city (cost=0.00..1189.66 > rows=158473 width=0) (actual time=68.290..68.290 rows=158003 loops=1) > Index Cond: (btrim(upper(city)) >= > 'NIJMEGEN'::text) > Total runtime: 7941.095 ms explain clearly shows, that index is used for addresses scan, but it is not so for users. explain estimates that 227197 customers match the lastname criteria - which looks awfuly high. how many record do you have in the customers table? i would try to create index test on customers(contactAddress, trim(uppercase(lastname))); or with other ordring of fields. try this - create the index, make analyze of customers table, and recheck explain. then try the second index in the same manner. maybe this could of some help... depesz