Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / COPY / 11 сообщений из 11, страница 1 из 1
05.07.2007, 13:34
    #34640864
postt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
Возрастет ли производительность и на сколько при замене INSERT-ов, запускаемых в цикле (за один такт вставляется одна запись), на COPY (тоже запускаемых в цикле)? Цикл примерно несколько тысяч проходов. Сейчас цикл заключен в одну транзакция BEGIN-цикл-COMMIT.
Программа написана на Си с использованием библиотеки libpq. Какие проблемы могут возникнуть при этой замене?
...
Рейтинг: 0 / 0
05.07.2007, 13:42
    #34640905
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
posttВозрастет ли производительность и на сколько при замене INSERT-ов, запускаемых в цикле (за один такт вставляется одна запись), на COPY (тоже запускаемых в цикле)? Цикл примерно несколько тысяч проходов. Сейчас цикл заключен в одну транзакция BEGIN-цикл-COMMIT.
Программа написана на Си с использованием библиотеки libpq. Какие проблемы могут возникнуть при этой замене?

COPY в каждой итерации цикла по одной записи? Немного не для того он думан. Вот если вы файл в несколько тысяч записей за раз в COPY прогоните, вот тогда производительность повысится в разы.
...
Рейтинг: 0 / 0
05.07.2007, 16:49
    #34641763
postuser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
Буду благодарен за простой пример использования команды COPY в C-программе с использованием библиотеки libpq. Нормальных примеров не нашел, только описание функций в доке на англ.
Данные, которые нужно вставить, находятся в файле. И еще будут ли работать при этом RULE?
...
Рейтинг: 0 / 0
05.07.2007, 17:06
    #34641843
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
Стыдись, Белое Перо.

"COPY FROM will invoke any triggers and check constraints on the destination table. However, it will not invoke rules."
...
Рейтинг: 0 / 0
05.07.2007, 17:48
    #34642017
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
postuserБуду благодарен за простой пример использования команды COPY в C-программе с использованием библиотеки libpq. Нормальных примеров не нашел, только описание функций в доке на англ.
Данные, которые нужно вставить, находятся в файле. И еще будут ли работать при этом RULE?

Пример? Но вызов COPY ничем не отличается от вызова инсерта. Обе команды обрабатывает сервер. Единственное, загружаемый файл должен быть на сервере, а не на клиентской машине (то есть быть доступен серверному процессу pg).

Вот небольшой пример (пишу на FreePascalCompiler) с использованием libpq:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
   exec_res := PQexec(conn, Pchar('COPY some_table (col1, col2, .. coln) FROM ''/home/postgres/dumps/aaa.txt'' '));
   if (PQresultStatus(exec_res) = PGRES_COMMAND_OK) then
   begin
      rows_affected := db_rows_affected (exec_res);
   end
   else
   begin
      fresult := PQresultErrorMessage(exec_res);
   end;

   PQclear(exec_res);
...
Рейтинг: 0 / 0
05.07.2007, 18:32
    #34642186
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
Thamerlan
...
Единственное, загружаемый файл должен быть на сервере, а не на клиентской машине (то есть быть доступен серверному процессу pg).
...

29.8.1. Functions for Sending COPY Data говорит что необязательно, если использовать COPY FROM STDIN :)
...
Рейтинг: 0 / 0
05.07.2007, 19:16
    #34642307
postt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
Thamerlan postuserБуду благодарен за простой пример использования команды COPY в C-программе с использованием библиотеки libpq. Нормальных примеров не нашел, только описание функций в доке на англ.
Данные, которые нужно вставить, находятся в файле. И еще будут ли работать при этом RULE?

Пример? Но вызов COPY ничем не отличается от вызова инсерта. Обе команды обрабатывает сервер. Единственное, загружаемый файл должен быть на сервере, а не на клиентской машине (то есть быть доступен серверному процессу pg).

Вот небольшой пример (пишу на FreePascalCompiler) с использованием libpq:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
   exec_res := PQexec(conn, Pchar('COPY some_table (col1, col2, .. coln) FROM ''/home/postgres/dumps/aaa.txt'' '));
   if (PQresultStatus(exec_res) = PGRES_COMMAND_OK) then
   begin
      rows_affected := db_rows_affected (exec_res);
   end
   else
   begin
      fresult := PQresultErrorMessage(exec_res);
   end;

   PQclear(exec_res);

Я ,наверно, не совсем понятно написал. Имелось ввиду, что в файле несовсем готовые данные (как формирует pg_dump). Данные из файла для начала нужно определенным образом обработать (добавить несколько полей, исключить ненужные строки) и только потом записать в БД с помощью COPY. Читал раздел 29.8. Functions Associated with the COPY Command, но там нет примеров использования. Нужно именно что-то типа чтения из stdin.
...
Рейтинг: 0 / 0
06.07.2007, 00:48
    #34642607
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
posttЯ ,наверно, не совсем понятно написал. Имелось ввиду, что в файле несовсем готовые данные (как формирует pg_dump). Данные из файла для начала нужно определенным образом обработать (добавить несколько полей, исключить ненужные строки) и только потом записать в БД с помощью COPY. Читал раздел 29.8. Functions Associated with the COPY Command, но там нет примеров использования. Нужно именно что-то типа чтения из stdin.

По поводу копирования из stdin'а из клиентского приложения не подскажу, не сталкивался. Но если не всё так прозрачно, то оно вам надо? Чем вас не устраивает текущая реализация?

Можно, конечно, через COPY загнать в темповую таблицу как есть, типа: (id SERIAL, full_line TEXT). А потом попробовать через INSERT INTO ... SELECT FROM ... Но тут надо знать более детально, что вы там обрабатываете.

Можно немного оптимизировать через PREPARE + в цикле EXECUTE:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN TRANSACTION;

PREPARE MyPlan1 (BIGINT, VARCHAR( 255 ), BOOLEAN) AS
   INSERT INTO MyTable (id, surname, isvalid) VALUES ($ 1 ,$ 2 ,$ 3 );
   
   EXECUTE MyPlan1 (  1 , 'Ivanov', false);
   EXECUTE MyPlan1 (  2 , 'Petrov', true);
   ...
   EXECUTE MyPlan1 ( n, 'Sidorov', false);

COMMIT;
...
Рейтинг: 0 / 0
06.07.2007, 06:49
    #34642681
postt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
Есть таблица:
Код: plaintext
1.
2.
3.
4.
5.
\d test_2
    Table "public.test_2"
 Column |  Type   | Modifiers
--------+---------+-----------
 id     | integer |
 p2     | text    |

Программа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
#include <stdlib.h>
#include <string.h>
#include "libpq-fe.h"

int main ()
{
      char *conninfo;
      PGconn *conn;
      PGresult *res;
      int n;

      conninfo = "dbname = test_db user=postgres";
      conn = PQconnectdb(conninfo);
      if (PQstatus(conn) != CONNECTION_OK)
      {
        printf("Connection to database '%s' failed.\n", PQdb(conn));
        printf("%s\n", PQerrorMessage(conn));
        exit( 1 );
      }

char textbuffer[ 120 ];
res = PQexec(conn, "COPY test_2 (id, p2) FROM STDIN WITH DELIMITER ',';");
if(PQresultStatus(res) != PGRES_COPY_IN)
{
    for(n= 0 ; n <  10 ; n++) {
        sprintf(textbuffer, "%i, text1", n);
        PQputCopyData(conn, textbuffer, strlen(textbuffer));
    }
}
PQputCopyEnd(conn, NULL);
PQgetResult(conn);

PQfinish(conn);
return  0 ;
}


Записи не вставляются, где тут может быть ошибка?
...
Рейтинг: 0 / 0
06.07.2007, 07:25
    #34642690
postt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
Тут опечатка
Код: plaintext
if(PQresultStatus(res) != PGRES_COPY_IN)
В исправленном варианте тоже не работает.
Код: plaintext
if(PQresultStatus(res) == PGRES_COPY_IN)
...
Рейтинг: 0 / 0
06.07.2007, 08:03
    #34642707
postt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COPY
Не было \n в конце строки, теперь работает.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / COPY / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]