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

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

"COPY FROM will invoke any triggers and check constraints on the destination table. However, it will not invoke rules."
...
Рейтинг: 0 / 0
COPY
    #34642017
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);
...
Рейтинг: 0 / 0
COPY
    #34642186
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thamerlan
...
Единственное, загружаемый файл должен быть на сервере, а не на клиентской машине (то есть быть доступен серверному процессу pg).
...

29.8.1. Functions for Sending COPY Data говорит что необязательно, если использовать COPY FROM STDIN :)
...
Рейтинг: 0 / 0
COPY
    #34642307
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
COPY
    #34642607
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
COPY
    #34642681
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица:
Код: 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
COPY
    #34642690
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут опечатка
Код: plaintext
if(PQresultStatus(res) != PGRES_COPY_IN)
В исправленном варианте тоже не работает.
Код: plaintext
if(PQresultStatus(res) == PGRES_COPY_IN)
...
Рейтинг: 0 / 0
COPY
    #34642707
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не было \n в конце строки, теперь работает.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / COPY
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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