Производительность Perl DBI на вложенных sql - PullRequest
2 голосов
/ 02 мая 2011

У меня есть вопрос о производительности обработки SQL в вложенных форм в Perl DBI.

В основном сценарий

подключается к DB1

подключается к DB2

извлекает данные из DBI

внутри цикла while

использует данные из DB1 и создает оператор обновления или вставки

выполняет sql в DB2

отсоединяется от DB2

отсоединяетсяDB1

Теперь вопрос в том, является ли это наилучшей практикой, когда речь идет о производительности, или метод ниже - лучшая альтернатива.

получить дату из DB1

записать данные в промежуточный файл

получить данные из промежуточного файла

  process the data to udpate in DB2. 

Изменить: я добавил подключиться к DB2 после подключения к DB1.но это не то, что я пытаюсь сделать.это больше касается вопроса о производительности ввода-вывода и системных вызовов, которые сервер выполняет для чтения с сервера базы данных и диска, на котором хранятся данные.

, если вы посмотрите на первый подход.

внутри петли.скрипт получает одну строку данных из DB1 и ожидает обработки возвращенных данных в DB2.

, если есть тысячи записей, как это влияет на производительность, когда вы делаете тысячи системных вызовов на сервер для чтения данных с диска

Ответы [ 3 ]

2 голосов
/ 02 мая 2011

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

Итак ...

подключиться к DB1

подключиться к DB2

извлечь данные из DB1

внутри цикла while

использовать данные из DB1 и создать обновление или вставитьоператор

выполнить SQL в DB2

отключиться от DB1

отключиться от DB2

1 голос
/ 03 мая 2011

при наличии тысяч записей, как это влияет на производительность, когда вы делаете тысячи системных вызовов на сервер для чтения данных с диска

Тысячи записей, это не так много, учитывая типичные небольшие или средние размеры записей. Вы не знаете, действительно ли данные читаются с диска или, скорее, находятся в буферах в памяти. Таким образом, вы не можете быть уверены в количестве системных вызовов. И зачем тебе это?

Если для вас важна производительность, я бы посоветовал вам протестировать оба метода в типичном реальном сценарии.

Если вы имеете дело с блокировкой базы данных и длительным процессом (по какой-либо причине), может быть предпочтительнее получить все необходимые данные одновременно (метод промежуточного файла), чтобы не удерживать блокировки на исходном и целевом серверах в течение всего периода обработки.

Ваш выбор может также зависеть от вашего знакомства с инструментами или API для массового импорта данных. Например, bcp.exe для MSSQL - удобный инструмент для экспорта и импорта данных. Большинство других баз данных имеют аналогичные инструменты.

0 голосов
/ 03 мая 2011

Я бы предложил сделать это параллельно, например, используя pipe() и fork() в вашем скрипте. В противном случае большую часть времени вы будете ожидать сетевой ввод-вывод. Так что это как

(SELECT, serialize, print) | (read line, deserialize, INSERT_OR_UPDATE)

...