Показать сообщение отдельно
Старый 06.06.2011, 11:38   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Katuxa Посмотреть сообщение
Она отрабатывает правильно, но по времени где-то 2-3 минуты.
попробую произнести на русском языке то, что вы написали

================
для каждой записи из buildTable
выбрать ВСЕ (!) записи из buildParam // в результате buildParm полностью перебирается столько раз сколько записей в buildTable

если нет записи в paramValue для комбинации buildTable, buildParam
то добавить в paramValue
================

во-первых, вы точно хотели выбирать ВСЕ возможные комбинации из buildTable, buildParam?
может эта пара у вас как-то связана?

во-вторых, у вас делается куча вложенных маленьких запросов внутри цикла.
по сути дела SQL-сервер захлебывается (ddos'ится).

попробуйте объединить запросы в один.
если логика правильна, то примерно так:
X++:
ttsbegin;
  while select BuildCode from buildTable
  join buildParam
  not exists join ParamCode from paramValue where paramValue.BuildCode == buildTable.BuildCode
                                        && paramValue.ParamCode == buildParam.ParamCode;
  {
     paramValue.BuildCode = buildTable.BuildCode;
     paramValue.ParamCode = buildParam.ParamCode;
     paramValue.insert();
  }
  ttscommit;
обратите внимание, что в этом случае запрос на SQL-сервер посылается один раз.
SQL-сервер один раз обрабатывает этот более сложный запрос вместо кучи маленьких.
далее мы от него получаем результаты один раз, а не внутри цикла.
накладных расходов меньше. profit.

будьте внимательны с not exists join в Аксапте (поищите на форуме, обсуждалось)
__________________
полезное на axForum, github, vk, coub.