The way to make this go faster is to set up the actually recommended infrastructure for full text search, namely create an index on (co_name_vec)::tsvector (either directly or using an auxiliary tsvector column). If you don't want to maintain such an index, fine, but don't expect full text search queries to be quick.
regards, tom lane
Dear Tom/List ,
co_name_vec is actually the auxiliary tsvector column that is mantained via a an update trigger. and the index that you suggested is there . consider simplified version. When we order by co_name the index on co_name_vec is not used some other index is used.
tradein_clients=> explain analyze SELECT profile_id from general.profile_master b where 1=1 and co_name_vec @@ to_tsquery ('manufacturer') order by co_name limit 25; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=0.00..3958.48 rows=25 width=25) (actual time=0.045..19.847 rows=25 loops=1) -> Index Scan using profile_master_co_name on profile_master b (cost=0.00..1125315.59 rows=7107 width=25) (actual time=0.043..19.818 rows=25 loops=1) Filter: ((co_name_vec)::tsvector @@ to_tsquery('manufacturer'::text)) Total runtime: 19.894 ms (4 rows)
tradein_clients=> explain analyze SELECT profile_id from general.profile_master b where 1=1 and co_name_vec @@ to_tsquery ('manufacturer') limit 25; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=0.00..101.18 rows=25 width=4) (actual time=0.051..0.632 rows=25 loops=1) -> Index Scan using profile_master_co_name_vec on profile_master b (cost=0.00..28761.89 rows=7107 width=4) (actual time=0.049..0.593 rows=25 loops=1) Index Cond: ((co_name_vec)::tsvector @@ to_tsquery('manufacturer'::text)) Total runtime: 0.666 ms (4 rows)