Thread: Re: Planner selects different execution plans depending on limit

Re: Planner selects different execution plans depending on limit

From
Bill Martin
Date:

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

 

Re: Planner selects different execution plans depending on limit

From
Tom Lane
Date:
Bill Martin <bill.martin@communote.com> writes:
> I�ve tried different values for the statistics but it is all the same (the planner decide to switch to a seqscan if
thelimit is 10). 

> ALTER TABLE core_content ALTER column content SET STATISTICS 1000;

Um, did you actually do an ANALYZE after changing that?

            regards, tom lane