Re: Planner Row Estimate with Function - Mailing list pgsql-general

From Pavel Stehule
Subject Re: Planner Row Estimate with Function
Date
Msg-id 162867790912291016q2ad8fc02xf0471fb06449c52c@mail.gmail.com
Whole thread Raw
In response to Re: Planner Row Estimate with Function  (Michael Fork <mfork00@yahoo.com>)
Responses Re: Planner Row Estimate with Function  (Michael Fork <mfork00@yahoo.com>)
List pgsql-general
2009/12/29 Michael Fork <mfork00@yahoo.com>:
> Pavel,
>
> Thanks for the suggestion but unfortunately the planner estimate was not really affected:

any string estimation are not exact.

you can use following dirty trick:


http://www.postgres.cz/index.php/PostgreSQL_SQL_Tricks#Using_IMMUTABLE_functions_as_hints_for_the_optimizer

Regards
Pavel
>
>                                        QUERY PLAN
> -------------------------------------------------------------------------------------------
>  Index Scan using idx_event_card_id on event  (cost=0.00..401311.59 rows=223890 width=103)
>   Index Cond: ("substring"(reference_code, 3, 13) = '0000057729970'::text)
> (2 rows)
> Thanks.
>
>
> Michael
>
>
>
> ----- Original Message ----
> From: Pavel Stehule <pavel.stehule@gmail.com>
> To: Michael Fork <mfork00@yahoo.com>
> Cc: pgsql-general@postgresql.org
> Sent: Tue, December 29, 2009 12:18:52 PM
> Subject: Re: [GENERAL] Planner Row Estimate with Function
>
> Hello
>
> 2009/12/29 Michael Fork <mfork00@yahoo.com>:
>> I have an index scan on a custom function that is returning a wildly incorrect row estimate that is throwing off the
restof the query planning.  The result of the function is roughly unique - there are a handful with multiple entries -
butthe planner is estimating 227,745 rows.  I re-ran ANALYZE on the table and the results did not change.  Any
suggestionson how to get more accurate planner result? 
>>
>>
>> Function definition:
>>
>> CREATE FUNCTION parsecardidfromreferencecode(text) RETURNS text AS $_$
>> BEGIN
>> RETURN SUBSTRING($1 FROM 3 FOR 13);
>> END;
>> $_$ LANGUAGE plpgsql IMMUTABLE;
>>
>
> try
> CREATE FUNCTION parsecardidfromreferencecode(text) RETURNS text AS $_$
> SELECT SUBSTRING($1 FROM 3 FOR 13);
> $_$ LANGUAGE sql;
>
> regards
> Pavel Stehule
>
>> Explain output:
>>
>> # explain select * from trail.event where type='CREDIT' and parsecardidfromreferencecode(reference_code) =
lpad(CAST('57729970'AS text), 13, '0'); 
>>                                        QUERY PLAN
>> -------------------------------------------------------------------------------------------
>>  Index Scan using idx_event_card_id on event  (cost=0.25..468642.89 rows=227745 width=104)
>>   Index Cond: (parsecardidfromreferencecode(reference_code) = '0000057729970'::text)
>>
>> Statistics:
>>
>> # SELECT null_frac, avg_width, n_distinct, most_common_vals, most_common_freqs, correlation, histogram_bounds FROM
pg_statsWHERE tablename = 'idx_event_card_id'; 
>>  null_frac | avg_width | n_distinct | most_common_vals | most_common_freqs | correlation |                          
                                          histogram_bounds 
>>
-----------+-----------+------------+------------------+-------------------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------
>>  0.0935673 |        17 |         -1 |                  |                   |    0.672617 |
{0000007932138,0000029448430,0000033432203,0000037841145,0000042171261,0000046399858,0000050938838,0000055122354,0003139385377,1220821134582,1261876426760}
>> Thanks.
>>
>>
>> Michael
>>
>>
>> --
>> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgsql-general
>>
>
>

pgsql-general by date:

Previous
From: Michael Fork
Date:
Subject: Re: Planner Row Estimate with Function
Next
From: Thomas Kellerer
Date:
Subject: Re: Planner Row Estimate with Function