Использование monetdb_append из MonetdbLite C API - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь использовать MonetDBLite C в приложении.В соответствии с PDF (https://arxiv.org/pdf/1805.08520.pdf), я бы выиграл от увеличения скорости загрузки огромного объема данных с помощью функции monetdb_append . Из PDF:

В дополнение квыполняя запросы SQL, встроенный процесс может эффективно массово добавлять большие объемы данных в базу данных с помощью функции monetdb_append, которая принимает схему и имя таблицы, к которой нужно добавить, и ссылку на данные, которые нужно добавить в столбцытаблица. Эта функция обеспечивает эффективную массовую вставку, поскольку при анализе отдельных операторов INSERT INTO возникают значительные накладные расходы, которые становятся узким местом, когда пользователь хочет вставить большой объем данных.

Этотакое объявление во встроенном. h

char* monetdb_append(monetdb_connection conn, const char* schema, const char* table, append_data *data, int ncols);

У кого-нибудь есть пример использования этой функции? Я предполагаю, что batid структуры append_data является идентификациейструктура BAT. Но не ясно, как это можно использовать с существующим API.

1 Ответ

0 голосов
/ 10 сентября 2018

Бинарное добавление действительно требует построения столько структур BAT, сколько у вас есть столбцов для добавления. Некоторые дополнительные заголовки MonetDBLite должны быть включены (monetdb_config.h и gdk.h). Важные части:

  1. Создайте BAT, используя COLnew с правильным типом и счетом
  2. Добавьте к ним некоторые значения, например, с помощью указателя доступа (правильной длины типа) до bat->theap.base[i]
  3. Установить свойства BAT (BATsetcount, BATsettrivprop и BBPkeepref) для приложения
  4. Выделите и заполните структуру данных append_data.
  5. Звоните monetdb_append.

Ниже приведен краткий пример того, как добавить 42 значения в таблицу из одного столбца, содержащую целые числа (CREATE TABLE test (my_column INTEGER);)

// startup, connect etc. before

size_t n = 42;
BAT* b = COLnew(0, TYPE_int, n, TRANSIENT);
for (size_t i = 0; i < n; i++) {
    ((int*)b->theap.base)[i] = i; // or whatever
}

BATsetcount(b, n);
BATsettrivprop(b);
BBPkeepref(b->batCacheid);

append_data *ad = NULL;
ad = malloc(1 * sizeof(append_data));
ad[0].colname = "my_column";
ad[0].batid = b->batCacheid;

if (monetdb_append(conn, "sys", "test", ad, 1) != NULL) { /* handle error */}
...