VoltDB выполняет несколько вставок за один вызов, C ++ API - PullRequest
0 голосов
/ 19 ноября 2018

В настоящее время у меня есть модель, в которой необходимо выполнить большое количество вставок (не при запуске) в одну и ту же таблицу. В настоящее время я готовлю значения вставки, установленные внутри кода C ++, а затем вызываю хранимую процедуру вставки по отдельности.

, например

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

Я хотел бы знать, возможно ли (используя VoltDB и клиент C ++):

1) Делаем объемные вставки например, * +1008 *

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

или

2) Передайте массив или строку, содержащую пользовательский разделитель, в хранимую процедуру, затем проанализируйте ее внутри и вызовите отдельные вставки внутри самой хранимой процедуры.

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

затем разбейте строку внутри процедуры.

Если это возможно, не могли бы вы указать мне пример или синтаксис API C ++, который бы облегчил реализацию? (например, зацикливание в хранимой процедуре для анализа строки и / или функций манипуляции со строками и т. д.)

Я хотел бы попробовать один из этих вариантов, чтобы проверить относительную производительность. Хотя я читал, что отдельные вставки должны быть достаточно быстрыми, я думаю, это может отличаться в зависимости от варианта использования.

1 Ответ

0 голосов
/ 19 ноября 2018

Отдельные вставки были бы быстрее, если бы вы вызвали процедуру вставки по умолчанию для таблицы, например, " TABLENAME .insert", которая принимает те же значения, что и INSERT ... VALUES, но обходит анализатор AdHoc SQLи направляется более непосредственно к разделу.Это даст вам лучшую производительность для вставки записей с использованием отдельного вызова процедуры для каждой строки.

В клиенте java есть API, который облегчает массовую загрузку таблицы.Вот пример учебника для этого: https://github.com/VoltDB/voltdb/tree/master/examples/HOWTOs/bulkloader

Если данные существуют в CSV-файле или файле с разделителями, вы можете использовать приложение csvloader, которое использует тот же API массового загрузчика.

Клиент C ++ не имеет реализации API массового загрузчика, поэтому, хотя это не невозможно, это будет намного сложнее.

Массовая вставка в форме INSERT ... VALUES ('1', '2'), (' 3 ',' 4 '), ... не поддерживаются VoltDB.

Возможен другой описанный вами подход.Вы можете написать хранимую процедуру Java, которая принимает VoltTable в качестве входного параметра, и из клиента C ++ создать объект Table, который соответствует VoltTable в Java.Или вы можете передать массивы значений.Однако ни VoltTable, ни массив не могут быть параметром ключа разделения для процедуры.Поэтому, если вы пытаетесь сделать что-то масштабное, вам понадобится отдельное значение параметра для ключа раздела, и вам нужно будет отправить набор записей, которые все принадлежат одному разделу.Это может быть трудно сделать.Самый простой способ - написать свою собственную функцию хеширования.Когда вы генерируете или получаете новые записи, вы можете хешировать их с помощью своей функции и группировать их в сегменты, а затем отправлять эти наборы записей в базу данных массовым образом со значением хеш-функции в качестве ключа раздела.Но вам нужно будет включить столбец в таблицу для этого значения хеш-функции.Поэтому записи с одинаковым значением хеш-функции будут принадлежать одному разделу.

Раскрытие информации: я работаю на VoltDB.

...