我正在尝试在应用程序中使用MonetDBLite C。根据PDF(https://arxiv.org/pdf/1805.08520.pdf(,我将受益于使用monetdb_append函数加载大量数据的速度提高。从 PDF 开始:
除了发出 SQL 查询外,嵌入式进程还可以 使用 monetdb_append函数。此函数采用架构和 要追加到的表的名称以及对要追加到的数据的引用 表的列。此功能可实现高效的批量 插入,因为解析涉及大量开销 单个 INSERT INTO 语句,当 用户想要插入大量数据。
这是嵌入式中的声明。
char* monetdb_append(monetdb_connection conn, const char* schema, const char* table, append_data *data, int ncols);
有没有人举例如何使用此功能?我假设append_data结构的batid是 BAT 结构的识别。但目前尚不清楚如何将其与现有API一起使用。
二进制追加确实需要构造与要追加的列一样多的 BAT 结构。需要包含一些额外的 MonetDBLite 标头(monetdb_config.h
和gdk.h
(。重要的部分是:
- 使用具有正确类型和计数的
COLnew
创建 BAT。 - 向它们添加一些值,例如通过指针访问(正确类型长度(到
bat->theap.base[i]
- 为追加设置 BAT 属性(
BATsetcount
、BATsettrivprop
和BBPkeepref
( - 分配和填充
append_data
数据结构。 - 呼叫
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 */}