The point was to show that yes, function calls take time, and using sub
functions take even more time. I am not about to write an additional more
detailed example just to show the same results. If you are in doubt, I
respectfully suggest you do your own testing.

On Sun, May 3, 2015 at 5:26 AM, Alban Hertroys <haram...@gmail.com> wrote:

>
> > On 03 May 2015, at 2:56, Melvin Davidson <melvin6...@gmail.com> wrote:
> >
> > OK, Here is a simple example that shows the difference between using a
> self contained function  and
> > one that calls sub functions.
> >
> > After loading all the functions below, repeat each of the EXPLAIN
> statements a few times and note that
> > callsubs takes almost TWICE as long to execute as nosub.
> >
> > CREATE OR REPLACE FUNCTION nosub(text)
> >   RETURNS void AS
> > $BODY$
> ...
> >     IF LENGTH(p_in_str) <= 6
> >         THEN RAISE NOTICE 'Hi %', p_in_str;
> >     ELSE
> >         RAISE NOTICE 'Hello %', p_in_str;
> >     END IF;
> >
> >     RETURN;
> > END;
> > $BODY$
> …
>
>
> >  CREATE OR REPLACE FUNCTION called1(text)
> >   RETURNS void AS
> > $BODY$
> ...
> >     RAISE NOTICE 'Hi %', p_in_str1;
> >
> >     RETURN;
> > END;
> > $BODY$
> …
>
> >  CREATE OR REPLACE FUNCTION called2(text)
> >   RETURNS void AS
> > $BODY$
> ...
> >     RAISE NOTICE 'Hello %', p_in_str2;
> >
> >     RETURN;
> > END;
> ...
>
>
> That's a rather uninteresting experiment, as all it does is call a
> function and raise a notice. Relative to what the functions do, the
> function call itself takes a significant amount of time. No surprise there,
> you'll see something similar in any language, even C. All you're showing is
> that calling a function takes some amount of time > 0.
>
> In C, a function call needs to look up an address to jump to, in plpgsql
> the database needs to look up the function body in a table. If the function
> is small and atomic it often gets called from multiple other functions and
> is probably cached anyway. The main difference between C and plpgsql here
> is that the latter is an interpreted language, so it does need to read in
> the entire function body after a call - which I'd expect to be quite a bit
> faster with a smaller (atomic) function body, especially when it hasn't
> been cached yet.
>
> So far I haven't been convinced.
>
> An actual use-case where the functions actually do something would be far
> more interesting. I doubt anybody writes functions just to raise a notice.
> I expect that in reality most plpgsql functions perform database queries
> and do something with the result. In such cases, function call overhead
> could be significant if the call is done for each record in a result set,
> for example. And even then it's worth considering whether that matters to
> your situation enough that it outweighs the usual benefits of code
> separation.
>
>
> > On Sat, May 2, 2015 at 7:37 PM, Adrian Klaver <adrian.kla...@aklaver.com>
> wrote:
> > On 05/02/2015 03:28 PM, Bill Moran wrote:
> > On Sat, 02 May 2015 15:06:24 -0700
> > Adrian Klaver <adrian.kla...@aklaver.com> wrote:
> >
> > On 05/02/2015 02:07 PM, Jeff Janes wrote:
> > On Sat, May 2, 2015 at 1:05 PM, Adrian Klaver <adrian.kla...@aklaver.com
> > <mailto:adrian.kla...@aklaver.com>> wrote:
> >
> >      On 05/02/2015 10:12 AM, Melvin Davidson wrote:
> >
> >          AFAIK, you cannot "package" functions in  PostgreSQL, but it is
> >          possible to
> >          call a function from within a function.
> >
> >          That being said, I would seriously look at how and why you are
> >          writing
> >          your functions
> >          as functions that call other functions are not very efficient.
> >
> >
> >      I am not following. That is what packaging is about, separating out
> >      'units of work' so they can be combined as needed. Part of that is
> >      using existing functions in new functions/classes. In fact in the
> >      Postgres source I see this in many places. Now it is entirely
> >      possible I missed a memo, so I am open to a more detailed
> >      explanation of the inefficiencies involved.
> >
> >
> > The Postgres source is written in C, not in plpgsql.  C has a good
> > optimizing compiler and plpgsql doesn't.
> >
> > Does this actually matter?  I am a biologist that backed into computing,
> > so I realize I am weak on the fundamentals. Still the scientist in me
> > wants data backing assertions. As I understand it plpgsql works close to
> > the server and is optimized to do so.  I know writing in C would be a
> > better solution. Still is calling plpgsql functions inside plpgsql
> > really a bad thing when just considering plpgsql?
> >
> > The answer to that is the same answer to so many other things: it
> depends.
> >
> > plpgsql functions are slower than C. They also lack a lot of language
> > features that C has. That being said, if they're meeting your needs, then
> > don't worry about it. plpgsql is around because for most people, it works
> > well enough. There are certainly cases when you want to create very
> complex
> > logic in the database and plpgsql is liable to make that difficult. But
> > there are a lot of cases where having to manage pointers and a build
> > environment and all the things that go with C aren't justified, because
> > plpgsql has none of that complexity. There are advantages both ways.
> >
> > The beauty of PostgreSQL is that you have both available and you
> > can choose whichever is best for your situation.
> >
> > Agreed, though in my case I drop into plpythonu when I want more complex
> solutions.
> >
> >
> >
> >
> > --
> > Adrian Klaver
> > adrian.kla...@aklaver.com
> >
> >
> >
> > --
> > Melvin Davidson
> > I reserve the right to fantasize.  Whether or not you
> > wish to share my fantasy is entirely up to you.
>
> Alban Hertroys
> --
> If you can't see the forest for the trees,
> cut the trees and you'll find there is no forest.
>
>


-- 
*Melvin Davidson*
I reserve the right to fantasize.  Whether or not you
wish to share my fantasy is entirely up to you.

Reply via email to