Re: Poor plan choice in prepared statement

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Merlin,

On Tue, Dec 30, 2008 at 11:42 AM, Merlin Moncure <mmoncure@xxxxxxxxx> wrote:
> On Tue, Dec 30, 2008 at 1:59 PM, bricklen <bricklen@xxxxxxxxx> wrote:
>> Hi, I am re-posting my question here after trying to find a solution
>> in the PHP pgsql list with no luck.
>>
>> I am experiencing some performance issues that I think are stemming
>> from prepared statements. I have a pretty simple query:
>> -- bad plan, from prepared statement
>> --
>> dev=# prepare fooplan (date,date,int,int) as
>> dev-# SELECT cl.idOffer AS campaign, cl.idAffiliate AS affiliate,
>> cl.idCreative AS creative, cl.subid, cl.datetime
>> dev-# FROM click AS cl LEFT JOIN conversion AS co ON cl.clickGenerated
>> = co.clickGenerated
>> dev-# WHERE cl."date" >= $1
>> dev-# AND cl."date" <= $2
>> dev-# AND cl.idAffiliate = $3
>> dev-# LIMIT $4;
>
> Your problem is that the query as written is hard to plan.  The
> database has no idea what you pass in, it has to guess.  (IMO, It
> almost always guesses wrong...I think it should assume 1 row
> returned).  Also, the db has no idea what you want to pass in at plan
> time for date.
>
> what indexes do you have on click?
>
> merlin
>

"click" is a partitioned table, but the child tables are all the same.
Here is the current partition:

dev=# \d click_current
     Column     |            Type             |                     Modifiers
----------------+-----------------------------+----------------------------------------------------
 id             | bigint                      | not null default
nextval('click_id_seq'::regclass)
 idaffiliate    | integer                     | not null
 idsite         | integer                     | not null
 idoffer        | integer                     | not null
 idcreative     | integer                     | not null
 idoptimizer    | integer                     |
 clickgenerated | character varying           | not null
 subid          | character varying           |
 datetime       | timestamp without time zone | not null
 date           | date                        |
 ip             | inet                        | not null
 xip            | inet                        |
 referrer       | text                        |
 countrycode    | character varying           |
 timestamp      | timestamp without time zone | not null
Indexes:
    "click_current_pk" PRIMARY KEY, btree (id)
    "click_current_clickgenerated_idx" btree (clickgenerated)
    "click_current_date_idx" btree (date)
    "click_current_idoffer_idx" btree (idoffer)
    "click_current_massive_idx" btree (date, idaffiliate, idsite,
idoffer, idcreative, idoptimizer, subid)
Check constraints:
    "click_current_date_chk" CHECK (date > '2008-12-29'::date)

-- 
Sent via pgsql-performance mailing list (pgsql-performance@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance

[Postgresql General]     [Postgresql PHP]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Yosemite]

  Powered by Linux