Tom Lane wrote:
> Bruce Momjian <[EMAIL PROTECTED]> writes:
> > I was just testing the threaded ecpg, and ran some performance tests.
> > Without using threads, I am seeing 100,000 inserts of a single word into
> > a simple table take 12 seconds:
> >     CREATE TABLE test_thread(message TEXT);
> > giving me 8333 inserts per second.  That seems very high.
> 
> Single transaction, or one transaction per INSERT?

This is ecpg, and I didn't have AUTOCOMMIT on, so it was a single
transaction.  I had forgotten that.

Also, I was wrong in my computations.  It is 4166 inserts per second,
not 8333.  Sorry.

I am now seeing more reasonable numbers:

        one INSERT per transaction, fsync true   934
        one INSERT per transaction, fsync false 1818
        one INSERT per transaction, fsync true  4166

> With the present WAL design, it's not possible for one backend to commit
> more than one transaction per disk rotation --- unless fsync is off, or
> your disk drive lies about write-complete.  Given that you recently
> updated your hardware, I'm betting on the last item ...

Yep.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
/*
 *      Thread test program
 *      by Philip Yarra
 */


#include <stdlib.h>

void            ins1(void);
void            ins2(void);

EXEC SQL BEGIN DECLARE SECTION;
char       *dbname;
int         iterations;
EXEC SQL END DECLARE SECTION;

int
main(int argc, char **argv)
{
        if (argc != 3)
        {
                fprintf(stderr, "Usage: %s dbname iterations\n", argv[0]);
                return 1;
        }
        dbname = argv[1];

        iterations = atoi(argv[2]);

        EXEC SQL CONNECT TO:dbname AS test0;

        /* DROP might fail */
        EXEC SQL AT test0 DROP TABLE test_thread;
        EXEC SQL AT test0 COMMIT WORK;
        EXEC SQL AT test0 CREATE TABLE test_thread(message TEXT);
        EXEC SQL AT test0 COMMIT WORK;
        EXEC SQL DISCONNECT test0;

        ins1();

        return 0;
}

void
ins1(void)
{
        int                     i;
        EXEC SQL WHENEVER sqlerror sqlprint;
        EXEC SQL CONNECT TO:dbname AS test1;
/*      EXEC SQL AT test1 SET AUTOCOMMIT = ON;*/
        for (i = 0; i < iterations; i++)
        {
                EXEC SQL AT test1 INSERT INTO test_thread VALUES('thread1');
        }
        EXEC SQL AT test1 COMMIT WORK;
        EXEC SQL DISCONNECT test1;
}
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to