Обсуждение: questions

Поиск
Список
Период
Сортировка

questions

От
Lendvary Gyorgy
Дата:
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

Re: [SQL] questions

От
Herouth Maoz
Дата:
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