Thread

  1. questions

    gyurika <gyurika@prolan.hu> — 1998-06-09T12:01:39Z

    I have a little problem with arrays. I,ve defined a type dbref. It has
    two fields: char type[200] and char record[200]. My prolem is that I
    can't insert a row into a table which has an attribute with type
    dbref[2].
    For instance:
    Create table boci (hapci dbref[2]);
    How can I insert a row into this table?
    Please help me!
    
    	My next problem is SPI interface. I have used LIBPQ but I need SPI. I
    have read a description in PostgrSQL Programmer's Guide, but I
    understand nearly nothing. Please write me where I can find a better
    description about SPI!
    
    	I have to treat very big tables from my C program. I update every
    attribute with update command. When I update an attribute, I must go
    through every tuple of the table. It takes a long time. I write you a
    little piece of my program:
    
    sprintf(buff, "CREATE TABLE boci (tup_num int, hapci int)");
    PQexec(conn, buff);
    for (i=0; i<10000; i++)
    {
        sprintf(buff, "INSERT INTO boci VALUES(i)");
        PQexec(conn, buff);
    }
    
    for (i=0; i<10000; i++)
    {
        x = GetValue(); /* GetValue isn't an interesting function */
        sprintf(buff, "UPDATE boci SET hapci = %d WHERE tup_num = %d", x,
    i);
        PQexec(conn, buff);
    }
    
    I don't want to update every tuple indvidually but I want to prepare a
    'block write'. I hope you understand what I'd like to.
    Can you give me a good method for saving a long time? I need a program
    that is about 10 times faster than mine.
    
    Thanks for your attention!
    
    gyurika@prolan.hu
    
    
  2. Re: [SQL] questions

    Herouth Maoz <herouth@oumail.openu.ac.il> — 1998-06-09T12:55:46Z

    At 15:01 +0300 on 9/6/98, Lendvary Gyorgy wrote:
    
    
    > sprintf(buff, "CREATE TABLE boci (tup_num int, hapci int)");
    > PQexec(conn, buff);
    > for (i=0; i<10000; i++)
    > {
    >     sprintf(buff, "INSERT INTO boci VALUES(i)");
    >     PQexec(conn, buff);
    > }
    >
    > for (i=0; i<10000; i++)
    > {
    >     x = GetValue(); /* GetValue isn't an interesting function */
    >     sprintf(buff, "UPDATE boci SET hapci = %d WHERE tup_num = %d", x,
    > i);
    >     PQexec(conn, buff);
    > }
    >
    > I don't want to update every tuple indvidually but I want to prepare a
    > 'block write'. I hope you understand what I'd like to.
    > Can you give me a good method for saving a long time? I need a program
    > that is about 10 times faster than mine.
    
    Batch inserts can be done faster with COPY rather than insert. I don't see
    why you first prepare your table and only then fill it with values. First,
    the record number could very well be created with a sequence, but even if
    you want to do it programmatically, you should make it much faster (and
    more efficient in disk space) if you insert the x directly.
    
    Read the description of how to use COPY in the libpq manual. In general, it
    would need to PQexec a COPY command, and then use PQputline inside the loop
    and PQendcopy after it. Do all this inside a transaction block, and you'll
    get the fastest results for an insert.
    
    If you still need to programmatically update the lines afterwards, it must
    be done with UPDATE. There's no help for it. But still, you can use it
    inside a transaction block to improve speed. If all you need to do is
    replace the values of hapci throughout, you can simply drop all the lines
    and use a new COPY.
    
    Herouth
    
    --
    Herouth Maoz, Internet developer.
    Open University of Israel - Telem project
    http://telem.openu.ac.il/~herutma