bulkinsert — передача VoltDB для выполнения нескольких вставок за один вызов, C ++ API

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

например

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

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

1) Делать объемные вставки
например

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

или же

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

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

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

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

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

1

Решение

Отдельные вставки были бы быстрее, если бы вы вызвали процедуру вставки по умолчанию для таблицы, например, «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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]