вставка sql- 1 большой запрос или много отдельных запросов

#php #sql #sql-server #insert #odbc

#php #sql #sql-сервер #вставить #odbc

Вопрос:

Я использую PHP с подключением odbc к базе данных MSSQL.

В настоящее время у меня около 1900 инструкций insert в одной строке, разделенных точкой с запятой, и я выполняю это в 1 инструкции odbc_execute.

Во-первых, плохой ли это метод? Должен ли я обрабатывать каждый оператор insert отдельно в цикле for?

Кроме того, то, как я сейчас это делаю, с помощью 1 большого оператора, по какой-то причине без ошибок вставляется максимум 483 строки. Если я скопирую инструкцию, которая выполняется, и выполняю это через SQL studio, вставляются все строки, но каждый раз вставляется максимум 483 строки. Есть идеи, почему это может быть?

Ответ №1:

Один сетевой переход туда и обратно на вставку будет означать большую задержку. Это будет очень медленно.

Вероятно, существует ограничение на размер буфера всех этих объединенных операторов SQL.

Я думаю, вы хотите использовать подготовленный оператор и связанные переменные:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms712553 (v = против 85).aspx

Вы все еще можете обработать это в цикле — два, на самом деле. Вам понадобится внутренний цикл для добавления вставок в пакет, который выполняется как отдельная транзакция, и внешний цикл для обработки всех необходимых пакетов.

Комментарии:

1. Так это то же самое, что в принципе сказать поместить каждые 100 строк в массив, затем выполнить цикл по этому массиву, выполняя ту же инструкцию odbc_execute?

Ответ №2:

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

Для такого рода «пакетной вставки» я обычно запускаю транзакцию для каждых 100 строк или около того.

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

Ответ №3:

Вы можете поместить данные в файл (xml?) на sql-сервере и запросить хранимую процедуру из php, которая их обработает.

с уважением, /t