Проблемы производительности Mssql / Perl DBI - PullRequest
1 голос
/ 11 августа 2011

Я пишу приложение, которое выполняет много больших операций вставки на удаленный mssql-сервер с Perl DBI. Не уверен, будет ли это сервер 05 или 08 sql, но я рассчитал его как до сих пор, так и производительность похожа. По сути, существует большое количество строк, которые нужно вставить, и они оказываются узким местом. Я пробовал многострочные вставки в 08 (и трюк UNION ALL для дополнительного выбора в 05), изменяя, запускаются ли вставки во время предыдущей выборки или после, используя execut_array () для вставок из одной строки, все это с / без обязательных параметров.

Psuedocode:

select data query
while fetchrow {
  do lots of calculations
  construct insert
  1) do inserts here
}
2) or do inserts here

Монитор активности на сервере sql усредняет многорядные вставки по 70 мс на штуку. Сами запросы были ограничены 58 строками на штуку, потому что на вставке 36 полей, и это легко достигает предела 2100 параметров.

Есть ли что-то очевидное, что я пропускаю? Любой другой метод, который я мог бы попытаться улучшить время? Игнорируя такие проблемы, как задержка или оборудование, я чувствую, что должно быть еще одно улучшение в моем рабочем процессе Perl или самих запросах. (Я искал bcp сервера sql, массовых вставок и т. Д.).

Спасибо за любой совет

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

execute_array не будет иметь большого значения, потому что он не реализован в DBD :: ODBC (потому что я никогда не удосужился об этом). Таким образом, это действительно DBI, просто вызывающий execute для вас.

Я не понимаю 58ish строк, 36 параметров и ограничение 2100 параметров, хотя я вижу, что 58 * 36 - это почти 2100. Если вашей вставке нужно 36 параметров, просто подготовьте ее перед выбором и выполните в цикле while - это должно быть быстрее, поскольку SQL не нужно передавать / анализировать каждую вставку.

Кроме того, вы можете отключить AutoCommit и фиксировать в конце или регулярно, но менее одного раза за вставку, это должно быть намного быстрее. У вас также могут быть индексы / триггеры и т. Д. В таблице, которые могут замедлять вставки, так что вы можете посмотреть на их отключение до тех пор.

1 голос
/ 11 августа 2011

Я полагаю, Perl / DBI является требованием (потому что, возможно, он не работает в Windows)?

Любая возможность использования BCP (вы бы написали промежуточный текстовый файл) или SSIS (вы могли бы делать все в SSIS) или даже ADO.NET SqlBulkCopy (в какой-то среде .NET)? Все это специально разработано для больших нагрузок.

...