Показать сообщение отдельно
Старый 06.06.2011, 12:25   #6  
Katuxa is offline
Katuxa
Участник
 
36 / 10 (1) +
Регистрация: 13.05.2011
Цитата:
Сообщение от mazzy Посмотреть сообщение
попробую произнести на русском языке то, что вы написали

================
для каждой записи из 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 в Аксапте (поищите на форуме, обсуждалось)
Сделала так, уже намного быстрее работает (за одну минуту). Спасибо! Но сейчас попробую еще другие предложенные варианты, может получится дойти до оптимального времени.