2013-10-03 4 views
2

Возможно ли выполнить оператор Array DML INSERT или UPDATE, передающий данные поля BLOB в массиве параметров? И что более важно, если это возможно, будет ли команда Array DML, содержащая BLOB-данные, еще эффективнее, чем выполнение команд один за другим?Возможно ли и целесообразно выполнить команду Array DML, содержащую данные BLOB?

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

Я использую FireDAC и работаю с базой данных SQLite (Params.BindMode = pbByNumber, поэтому я использую собственный SQLite INSERT с несколькими VALUES). Моя цель - как можно быстрее хранить около 100 тыс. Записей, содержащих довольно маленькие данные BLOB (около 1 кБ на запись) (в стоимости абстракции FireDAC).

ответ

5

Главное в вашем случае состоит в том, что вы используете базу данных SQLIte3.

С SQLite3, Array DML «эмулируется» FireDAC. Поскольку это локальный экземпляр , а не экземпляр клиент-сервер, нет необходимости готовить кучу строк, а затем отправлять их сразу, чтобы избежать латентности сети (как в случае с Oracle или MS SQL).

Использование Array DML может ускорить процесс ввода немного с SQLite3, но я сомневаюсь, что он будет очень высоким. Хороший простой INSERT с привязкой к числу будет работать нормально.

Основные советы о производительности в вашем случае будут:

  • Гнезда своего процесса внутри одной транзакции (или даже лучше, использовать одну транзакцию на 1000 строк данных);
  • Подготовьте инструкцию INSERT, а затем повторно запустите ее с привязывающим параметром каждый раз;
  • По умолчанию FireDAC инициализирует SQLite3 с самыми быстрыми параметрами (например, отключает LOCK), поэтому пусть это будет.

SQlite3 очень хорош в отношении процесса BLOB.

From my tests, FireDAC установка времени очень хорошее, очень близко к прямому доступу SQlite3. Только чтение происходит медленнее, чем прямая ссылка SQLite3, из-за накладных расходов класса Delphi TDataSet.