Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> writes: > Bill Martin <bill(dot)martin(at)communote(dot)com> writes: >> I´ve created following table which contains one million records. >> ...
>> "Limit (cost=10091.09..19305.68 rows=3927 width=621) (actual >> time=0.255..0.255 rows=0 loops=1)" >> " -> Bitmap Heap Scan on core_content content (cost=10091.09..57046.32 >> rows=20011 width=621) (actual time=0.254..0.254 rows=0 loops=1)" >> " Recheck Cond: (to_tsvector('simple'::regconfig, content) @@ >> '''asdasdadas'':*'::tsquery)" >> " -> Bitmap Index Scan on ft_simple_core_content_content_idx >> (cost=0.00..10086.09 rows=20011 width=0) (actual time=0.251..0.251 rows=0 >> loops=1)" >> " Index Cond: (to_tsvector('simple'::regconfig, content) @@ >> '''asdasdadas'':*'::tsquery)" >> "Total runtime: 0.277 ms" >> Is there any posibility to tune up the performance even if the limit is only >> 10? > The problem is the way-off rowcount estimate (20011 rows when it's > really none); with a smaller estimate there, the planner wouldn't decide > to switch to a seqscan. > > Did you take the advice to increase the column's statistics target? > Because 20011 looks suspiciously close to the default estimate that > tsquery_opr_selec will fall back on if it hasn't got enough stats > to come up with a trustworthy estimate for a *-pattern query. > > (I think there are probably some bugs in tsquery_opr_selec's estimate > for this, as I just posted about on pgsql-hackers. But this number > looks like you're not even getting to the estimation code, for lack > of enough statistics entries.) > > The other thing that seems kind of weird here is that the cost estimate > for the bitmap index scan seems out of line even given the > 20000-entries-to-fetch estimate. I'd have expected a cost estimate of a > few hundred for that, not 10000. Perhaps this index is really bloated, > and it's time to REINDEX it? > > regards, tom lane Hi, thank you for helping me. I´ve tried different values for the statistics but it is all the same (the planner decide to switch to a seqscan if the limit is 10). ALTER TABLE core_content ALTER column content SET STATISTICS 1000; I also tried to reindex the index but the planner decide to switch to a seqscan. REINDEX INDEX ft_simple_core_content_content_idx; Disable the seqscan helps me but is this a good decision for all use cases? SET enable_seqscan = off; Are there any other possibilities to solve my problem? Best regards, Bill Martin