Thread

  1. pgbench post-connection command

    Simon Riggs <simon@2ndquadrant.com> — 2012-01-12T14:59:45Z

    New -x option for pgbench executes the given command once after
    connection of each session.
    
    e.g.
    pgbench -x "SET synchronous_commit = off"
    pgbench -x "SET foo_extension.enabled = on"
    
    Allows easier testing of user parameters. Command listed in final report
    
    $ pgbench -c 2 -t 4 -x "set synchronous_commit = off"
    starting vacuum...end.
    transaction type: TPC-B (sort of)
    post connect command: [set synchronous_commit = off]
    scaling factor: 1
    query mode: simple
    number of clients: 2
    number of threads: 1
    number of transactions per client: 4
    number of transactions actually processed: 8/8
    tps = 122.897304 (including connections establishing)
    tps = 179.953212 (excluding connections establishing)
    
    -- 
     Simon Riggs                   http://www.2ndQuadrant.com/
     PostgreSQL Development, 24x7 Support, Training & Services
    
  2. Re: pgbench post-connection command

    Tom Lane <tgl@sss.pgh.pa.us> — 2012-01-12T15:26:49Z

    Simon Riggs <simon@2ndQuadrant.com> writes:
    > New -x option for pgbench executes the given command once after
    > connection of each session.
    
    This seems rather poorly designed, mainly because there's no reason to
    think that a single command would be sufficient.
    
    What would make more sense to me is to add an option for a one-time
    script, or possibly extend the script language to allow marking some
    commands as "do once".
    
    			regards, tom lane
    
    
  3. Re: pgbench post-connection command

    Alvaro Herrera <alvherre@commandprompt.com> — 2012-01-12T15:49:16Z

    Excerpts from Tom Lane's message of jue ene 12 12:26:49 -0300 2012:
    > Simon Riggs <simon@2ndQuadrant.com> writes:
    > > New -x option for pgbench executes the given command once after
    > > connection of each session.
    > 
    > This seems rather poorly designed, mainly because there's no reason to
    > think that a single command would be sufficient.
    > 
    > What would make more sense to me is to add an option for a one-time
    > script, or possibly extend the script language to allow marking some
    > commands as "do once".
    
    Maybe use isolation tester spec files as examples, which has blocks for
    a "setup" as well as "teardown", in addition to whatever commands are to
    run.  It's possible that teardown is not ever necessary -- who knows?
    
    -- 
    Álvaro Herrera <alvherre@commandprompt.com>
    The PostgreSQL Company - Command Prompt, Inc.
    PostgreSQL Replication, Consulting, Custom Development, 24x7 support
    
    
  4. Re: pgbench post-connection command

    Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> — 2012-01-12T15:51:56Z

    On 12.01.2012 17:26, Tom Lane wrote:
    > Simon Riggs<simon@2ndQuadrant.com>  writes:
    >> New -x option for pgbench executes the given command once after
    >> connection of each session.
    
    If it's just for SET, you could just put the GUCs in postgresql.conf.
    
    > This seems rather poorly designed, mainly because there's no reason to
    > think that a single command would be sufficient.
    >
    > What would make more sense to me is to add an option for a one-time
    > script, or possibly extend the script language to allow marking some
    > commands as "do once".
    
    Hmm, that might be handy. I wanted to write a some tests a while ago 
    where each session operated on a separate table. With this, I could've 
    put the CREATE TABLE statement in the statup-script.
    
    -- 
       Heikki Linnakangas
       EnterpriseDB   http://www.enterprisedb.com
    
    
  5. Re: pgbench post-connection command

    Tom Lane <tgl@sss.pgh.pa.us> — 2012-01-12T16:10:32Z

    Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> writes:
    > On 12.01.2012 17:26, Tom Lane wrote:
    >> Simon Riggs<simon@2ndQuadrant.com>  writes:
    >>> New -x option for pgbench executes the given command once after
    >>> connection of each session.
    
    > If it's just for SET, you could just put the GUCs in postgresql.conf.
    
    Or use PGOPTIONS.  I think there might be a use-case for this sort of
    thing, but it's going to be more complicated than a SET or two; that's
    why I think the feature ought to provide for a script not just a
    command.
    
    One particular use-case that comes to mind is executing \set commands
    that only need to be done once, not once per iteration.
    
    			regards, tom lane
    
    
  6. Re: pgbench post-connection command

    Simon Riggs <simon@2ndquadrant.com> — 2012-01-12T16:12:09Z

    On Thu, Jan 12, 2012 at 3:26 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    > Simon Riggs <simon@2ndQuadrant.com> writes:
    >> New -x option for pgbench executes the given command once after
    >> connection of each session.
    >
    > This seems rather poorly designed, mainly because there's no reason to
    > think that a single command would be sufficient.
    
    It supports multiple commands via multi-statement requests
    e.g.
    
    -x "SET this = on; SET that = off"
    
    
    > What would make more sense to me is to add an option for a one-time
    > script, or possibly extend the script language to allow marking some
    > commands as "do once".
    
    That seems a little overcooked. Any long preparatory script can be
    executed before pgbench. So this command is only for options that need
    to be set on each database session. If you really do have a long
    script that needs to be run for each session, you can set the command
    to "SELECT execute_my_initial_function()" and then write your script
    as a function.
    
    -- 
     Simon Riggs                   http://www.2ndQuadrant.com/
     PostgreSQL Development, 24x7 Support, Training & Services
    
    
  7. Re: pgbench post-connection command

    Tom Lane <tgl@sss.pgh.pa.us> — 2012-01-12T16:24:26Z

    Simon Riggs <simon@2ndQuadrant.com> writes:
    > On Thu, Jan 12, 2012 at 3:26 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    >> This seems rather poorly designed, mainly because there's no reason to
    >> think that a single command would be sufficient.
    
    > It supports multiple commands via multi-statement requests
    > e.g.
    > -x "SET this = on; SET that = off"
    
    I don't believe that works for multiple \set commands, which is the
    more likely use-case for this; as noted upthread, executing SET here
    is quite unnecessary since you can get that behavior with
    "export PGOPTIONS".
    
    			regards, tom lane
    
    
  8. Re: pgbench post-connection command

    Simon Riggs <simon@2ndquadrant.com> — 2012-01-12T16:50:25Z

    On Thu, Jan 12, 2012 at 4:24 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    > Simon Riggs <simon@2ndQuadrant.com> writes:
    >> On Thu, Jan 12, 2012 at 3:26 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    >>> This seems rather poorly designed, mainly because there's no reason to
    >>> think that a single command would be sufficient.
    >
    >> It supports multiple commands via multi-statement requests
    >> e.g.
    >> -x "SET this = on; SET that = off"
    >
    > I don't believe that works for multiple \set commands, which is the
    > more likely use-case for this; as noted upthread, executing SET here
    > is quite unnecessary since you can get that behavior with
    > "export PGOPTIONS".
    
    OK, so you want...
    
    \setonce <command>
    
    or?
    
    -- 
     Simon Riggs                   http://www.2ndQuadrant.com/
     PostgreSQL Development, 24x7 Support, Training & Services
    
    
  9. Re: pgbench post-connection command

    Tom Lane <tgl@sss.pgh.pa.us> — 2012-01-12T17:32:15Z

    Simon Riggs <simon@2ndQuadrant.com> writes:
    > On Thu, Jan 12, 2012 at 4:24 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    >> I don't believe that works for multiple \set commands, which is the
    >> more likely use-case for this; as noted upthread, executing SET here
    >> is quite unnecessary since you can get that behavior with
    >> "export PGOPTIONS".
    
    > OK, so you want...
    
    > \setonce <command>
    
    More like "\once ... any SQL command or meta command here ..."
    if we want to extend the scripting language.  But I'd be perfectly happy
    with a command-line switch that specifies a script file to be run once.
    
    A difficulty with \once is that it's not very clear what should happen
    in the case of multiple scripts (multiple -f switches).  Should we go
    through all of them at startup looking for \once switches?  Or should
    it happen the first time a given script is selected for execution?
    And do conflicting \once \sets in different scripts affect each other?
    If we go with a command-line switch then the confusion goes away, as it
    is then clear that the start script's settings should be inherited by
    all the client tasks.
    
    			regards, tom lane
    
    
  10. Re: pgbench post-connection command

    Simon Riggs <simon@2ndquadrant.com> — 2012-01-12T19:21:31Z

    On Thu, Jan 12, 2012 at 5:32 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    
    > More like "\once ... any SQL command or meta command here ..."
    > if we want to extend the scripting language.  But I'd be perfectly happy
    > with a command-line switch that specifies a script file to be run once.
    
    Once per connection, yes?
    
    -- 
     Simon Riggs                   http://www.2ndQuadrant.com/
     PostgreSQL Development, 24x7 Support, Training & Services
    
    
  11. Re: pgbench post-connection command

    Tom Lane <tgl@sss.pgh.pa.us> — 2012-01-12T20:04:32Z

    Simon Riggs <simon@2ndQuadrant.com> writes:
    > On Thu, Jan 12, 2012 at 5:32 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    >> More like "\once ... any SQL command or meta command here ..."
    >> if we want to extend the scripting language. But I'd be perfectly happy
    >> with a command-line switch that specifies a script file to be run once.
    
    > Once per connection, yes?
    
    Hmmm ... good question.  Heikki was speculating about doing CREATE TABLE
    or similar, which you'd want done only once period.  But I see no very
    strong reason why cases like that couldn't be handled outside of
    pgbench.  So yeah, once per connection.
    
    			regards, tom lane
    
    
  12. Re: pgbench post-connection command

    Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> — 2012-01-12T20:53:18Z

    On 12.01.2012 22:04, Tom Lane wrote:
    > Simon Riggs<simon@2ndQuadrant.com>  writes:
    >> On Thu, Jan 12, 2012 at 5:32 PM, Tom Lane<tgl@sss.pgh.pa.us>  wrote:
    >>> More like "\once ... any SQL command or meta command here ..."
    >>> if we want to extend the scripting language.  But I'd be perfectly happy
    >>> with a command-line switch that specifies a script file to be run once.
    >
    >> Once per connection, yes?
    >
    > Hmmm ... good question.  Heikki was speculating about doing CREATE TABLE
    > or similar, which you'd want done only once period.
    
    I was creating a separate table for each connection to work with...
    
    >  But I see no very
    > strong reason why cases like that couldn't be handled outside of
    > pgbench.  So yeah, once per connection.
    
    ... so that is exactly what I was thinking too.
    
    For things that only need to run once, period, you can just do:
    
    psql -c "CREATE TABLE"; pgbench ...
    
    -- 
       Heikki Linnakangas
       EnterpriseDB   http://www.enterprisedb.com
    
    
  13. Re: pgbench post-connection command

    Simon Riggs <simon@2ndquadrant.com> — 2012-01-13T09:34:05Z

    On Thu, Jan 12, 2012 at 8:04 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    > Simon Riggs <simon@2ndQuadrant.com> writes:
    >> On Thu, Jan 12, 2012 at 5:32 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    >>> More like "\once ... any SQL command or meta command here ..."
    >>> if we want to extend the scripting language.  But I'd be perfectly happy
    >>> with a command-line switch that specifies a script file to be run once.
    >
    >> Once per connection, yes?
    >
    > Hmmm ... good question.  Heikki was speculating about doing CREATE TABLE
    > or similar, which you'd want done only once period.  But I see no very
    > strong reason why cases like that couldn't be handled outside of
    > pgbench.  So yeah, once per connection.
    
    OK, its a TODO item, but I don't think I'll have time for it for the next CF.
    
    If we need it during testing of other patches then I'll write it.
    
    -- 
     Simon Riggs                   http://www.2ndQuadrant.com/
     PostgreSQL Development, 24x7 Support, Training & Services
    
    
  14. Re: pgbench post-connection command

    Greg Smith <greg@2ndquadrant.com> — 2012-01-13T13:10:27Z

    There's one part of this that's still fuzzy in the spec I'd like to 
    clarify, if nothing else than for my own memory's sake--as the person 
    most likely to review a random pgbench patch.  Simon gave an example 
    like this:
    
       pgbench -x "SET synchronous_commit = off"
    
    All are agreed this should take the name of a script instead on the 
    command line:
    
       pgbench -x "nosync"
    
    And execute that script as part of the initial setup to every connection.
    
    Now:  "nosync" might be a shell script called similarly to \shell.  
    That's more flexible in terms of its ability to do complicated setup 
    things, say a more ambitious iteration along the 'create a table per 
    connection' trail.  But it can't really prime connection parameters 
    anymore, so that's pretty worthless.
    
    It seems it must then be a pgbench script like "-f" specifies instead.  
    It will execute SQL and pgbench's \ meta commands.  And I think that's 
    OK so long as two things are nailed down (as in, tested to work and 
    hopefully alluded to in the documentation):
    
    1) The pgbench connection setup script can call \shell or \setshell.  
    Then we've got a backdoor to also handle the complicated external script 
    situation.
    
    2) The connection setup script can set variables and they will still be 
    active after passing control to the main test script.  Returning to the 
    "table per connection" sort of idea, that might be:
    
    setup:
    
    \setrandom tablename 1 100
    CREATE TABLE test_:tablename;
    
    main:
    
    SELECT count(*) FROM test_tablename;
    
    I would use this feature all the time once it was added, so glad to see 
    the idea pop up.  I also have a long standing personal TODO to write a 
    doc update in this area:  suggest how to use environment variables to 
    sneak settings into things.  There's been a couple of ideas for pgbench 
    proposed that were blocked with "you can already do that setting PGxxx 
    before calling pgbench".  That is true, but not obvious, and 
    periodically it get reinvented again.
    
    -- 
    Greg Smith   2ndQuadrant US    greg@2ndQuadrant.com   Baltimore, MD
    PostgreSQL Training, Services, and 24x7 Support www.2ndQuadrant.com