Как добавить параметры в оператор массовой вставки для защиты от внедрения SQL и повышения производительности? - PullRequest
1 голос
/ 10 февраля 2011

Я импортирую файл от пользователя в Интернете, который содержит 150 тыс. Строк и должен быть разбит, в результате чего в базу данных будет добавлено около 1,6 млн. Элементов.

В данный момент я добавляюсначала первичную запись, а затем добавьте потомков с ключом, который был указан после первой записи.

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

В данный момент я импортирую только со скоростью около 300 строк или 3000 запросов / сек. С помощью метода запроса.

1 Ответ

0 голосов
/ 27 марта 2011

Я не уверен, каковы ваши ограничения в отношении того, как вы можете загружать данные, но есть несколько хороших способов получить хорошие показатели массового импорта в базу данных -> Выполнение операций группового копирования . При работе с процессом импорта данных мне всегда было полезно разбить его на этапы:

  1. Фаза импорта - в зависимости от вашей ситуации доступны различные методологии массовых операций
  2. этап подготовки - процесс работы; например проверка данных, построение ключевых отношений, очистка данных и т. д.
  3. Финальная вставка в «живые» таблицы. (надеюсь, на основе вставки)

Может быть очень эффективно собрать все данные на первом проходе практически без какой-либо логической работы и переместить их в массовую область подготовки; или для этого используются временные таблицы или постоянные промежуточные таблицы. Затем вы можете выполнить любую обработку данных, чтобы все было правильно структурировано и очищено, прежде чем массово вставлять их в их окончательный дом в живых таблицах. Это также может дать вам некоторый уровень изоляции от любых вредоносных данных или атак с использованием SQL-инъекций, если выполнить один или несколько промежуточных шагов.

Это разделение позволяет выполнить задачу массового импорта настолько быстро, насколько вы можете ее выполнить, потому что, надеюсь, очень мало логики требуется для массового импорта в большой промежуточный полигон. Затем вы можете применить любую логику, необходимую для среза данных, насколько это уместно. Кроме того, если у вас есть несколько шагов, которые необходимо выполнить на этапе подготовки, вы можете разбить его на множество меньших шагов и сосредоточиться на оптимизации самых больших / самых медленных частей.

В вашей ситуации, если есть способ, которым вы можете структурировать данные после перехода к этапу подготовки, чтобы соответствовать тому, что находится в живых таблицах, вы могли бы вставить их как один большой набор. Возможность построения отношений PK-> ForeignKey на этапе подготовки перед окончательной вставкой (а также обработка любой другой работы по обработке данных) может позволить вам перейти от итеративных вставок к одной большой вставке массивного набора. set на основе обычно очень хорошая вещь . То есть, конечно, если ваша система / ограничения позволяют вам делать так.

Я не уверен, относится ли что-либо из этого к вашей ситуации или нет, если я далеко от базы от того, что вы просили; но, надеюсь, там есть что-то полезное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...