VoltDB通过一次调用C ++ API执行多次插入

时间:2018-11-19 16:11:33

标签: c++ bulkinsert voltdb

我目前有一个模型,其中需要在同一张表上进行大量插入操作(而不是在启动时)。目前,我正在准备在C ++代码中设置的插入值,然后分别调用插入存储过程。

例如

leftRotate() == 'x'

我想知道是否有可能(使用VoltDB和C ++客户端):

1)批量插入 例如

#left rotate using slicing
def leftRotate(arr, k, n):
    arr=arr[k:]+arr[:k] # not sure this is right, but once you get the return working, it should be easy to debug
    # print arr # changed
    return arr

arr = [1, 2, 3, 4, 5, 6, 7] 
# leftRotate(arr, 2, 7) # changed
arr = leftRotate(arr, 2, 7) 
print arr

2)将包含自定义定界符的数组或字符串传递到存储过程中,然后在内部对其进行解析并调用存储过程本身内部的各个插入。

INSERT ... VALUES ('1','2')
INSERT ... VALUES ('3','4')
INSERT ... VALUES ('5','6')

然后在过程中拆分字符串。

如果可能的话,请给我指出一个示例,还是可以促进实现的C ++ API语法? (例如,循环访问存储过程,以便解析字符串和/或字符串操作函数等)

我想尝试这些选项之一,以测试相对性能。尽管我已经读过,单个插入应该足够快,但是我认为这可能会因使用情况而有所不同。

1 个答案:

答案 0 :(得分:1)

如果您为表格调用了默认的插入过程,则单个插入会更快。 “ TABLENAME .insert”,其值与INSERT ... VALUES相同,但绕过AdHoc SQL解析器,并更直接地路由到分区。这将为您提供最佳性能,以便为每行使用单独的过程调用来插入记录。

在Java客户端上,有一个API可以简化表的批量加载。这里有一个示例教程:https://github.com/VoltDB/voltdb/tree/master/examples/HOWTOs/bulkloader

如果数据存在CSV或定界文件中,则可以利用csvloader应用程序,该应用程序使用相同的bulkloader API。

C ++客户端没有实现bulkloader API的实现,因此虽然并非​​不可能,但要困难得多。

VoltDB不支持INSERT ... VALUES('1','2'),('3','4'),...形式的批量插入。

您描述的另一种方法是可行的。您可以编写一个以VoltTable作为输入参数的Java存储过程,并从C ++客户端构建一个Table对象,该对象对应于Java中的VoltTable。或者,您可以传入值数组。但是,VoltTable或数组都不能成为该过程的分区键参数。因此,如果您尝试进行大规模操作,则需要为分区键设置一个单独的参数值,并且需要发送一组全部属于同一分区的记录集。那可能很难做到。最简单的方法是编写自己的简单哈希函数。生成或接收新记录时,可以使用函数对它们进行哈希处理并将它们分组到存储桶中,然后将这些记录集以哈希值作为分区键批量发送到数据库。但是您必须在表中包含此哈希值的列。因此,具有相同哈希值的记录将属于同一分区。

披露:我在VoltDB工作。