From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | google(at)newtopia(dot)com (Michael Pohl) |
Cc: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: plpgsql vs. SQL performance |
Date: | 2003-05-25 03:23:10 |
Message-ID: | 2955.1053832990@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
google(at)newtopia(dot)com (Michael Pohl) writes:
> I am occasionally seeing plpgsql functions significantly underperform
> their straight SQL equivalents.
Almost certainly, a different query plan is getting chosen in the
plpgsql case.
One common cause of this problem is sloppiness about datatypes. You
have declared $1 and $2 of the plpgsql function to be integer; are
the columns they're being compared to also integer? If not, that's
likely preventing indexscans from being used.
Another common cause of this sort of thing is that the planner makes
conservative choices because it doesn't have exact runtime values for
the constants in the query. What you are really comparing here is
plpgsql:
select ... where user_id = $1 and status_id = $2
SQL:
select ... where user_id = 1 and status_id = 2
In the latter case the planner can consult pg_statistic to get a pretty
good idea about how many rows will be selected, whereas in the former
case its guess is much more approximate. (I'd still expect an indexscan
to get picked though, unless you have *very* skewed data statistics for
these columns. Usually it's inequalities that push the planner to use
a seqscan in these cases.)
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2003-05-25 03:31:28 | Re: Transaction Triggers! |
Previous Message | Vincent Hikida | 2003-05-25 03:14:33 | Re: plpgsql recursion |