> - Have you changed the random page cost on either installation? This is whatever the default is for both boxes (commented config file says 4.0) > - Have both installations had VACUUM ANALYZE run recently? This is the first thing I did and didn't seem to do anything. Oddly enough I just went and did a VACUUM ANALYZE on a newly restored db on the test server and get the same query plan as production so I am now guessing something with the stats from ANALYZE are making postgres think the string index is the best bet but is clearly 1000's of times slower. > - Are the stats targets the same on both installations? If you mean default_statistics_target that is also the default (commented config file says 10) > - Do both installations have similar shared buffers, total available RAM info, etc? The boxes have different configs as the test box isn't as big as the production on so it doesn't have as much resources available or allocated to it. I did run the query on the backup db box (exact same hardware and configuration as the production box) which gets restored from a backup periodically (how I populated the test db) and got the same results as the test box.