0

我正在尝试在应用程序中使用 MonetDBLite C。根据 PDF ( https://arxiv.org/pdf/1805.08520.pdf ),我将受益于使用monetdb_append函数加载大量数据的速度提高。来自PDF:

除了发出 SQL 查询之外,嵌入式进程还可以使用 monetdb_append 函数有效地将大量数据批量追加到数据库中。此函数采用模式和要附加到的表的名称,以及对要附加到表列的数据的引用。此函数允许有效的批量插入,因为在解析单个 INSERT INTO 语句时涉及大量开销,当用户想要插入大量数据时,这会成为瓶颈。

这是 Embedded.h 中的声明

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

有没有人举例说明如何使用这个功能?我假设append_data结构的 batid是 BAT 结构的标识。但目前尚不清楚如何将其与现有 API 一起使用。

4

1 回答 1

0

二进制追加确实需要构建与要追加的列一样多的 BAT 结构。需要包含一些额外的 MonetDBLite 标头(monetdb_config.hgdk.h)。重要的部分是:

  1. COLnew使用正确的类型和计数创建 BAT
  2. 向它们添加一些值,例如通过指针访问(具有正确的类型长度)到bat->theap.base[i]
  3. 为追加设置 BAT 属性 (BATsetcountBATsettrivprop)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 */}
于 2018-09-10T09:18:40.740 回答