Цитата:
Сообщение от
axaLearner
Возник вопрос: что производительнее
while select purchLine
{
inventTable = InventTable::find(PurchLine.itemId);
some action;
}
или
while select purchLine
join inventTable
where purchLine.ItemId == inventTable.ItemId
{
some action
}
?
В общем случае второй вариант.
Но зачастую - первый. Тут правильно говорили о кэшировании.
Но не только кэширование. Вы привели только один дополнительный поиск - номенклатуру. По строке закупке можно многое чего искать дополнительно. И название склада, и параметры парти, прочие складские аналитики и финансовые, дополнительные параметры для лота возврата, искать складские проводки с лотом и т.п.
Т.е. правильно вопрос выглядит так:
что лучше
X++:
while select purchLine
{
inventTable = InventTable::find(PurchLine.itemId);
some action;
if( some1 ) someTable1::find(PurchLine.someId1);
if( some2 ) someTable2::find(PurchLine.someId2);
if( some3 ) someTable3::find(PurchLine.someId3);
...
}
или
X++:
while select purchLine
join inventTable
where purchLine.ItemId == inventTable.ItemId
join someTable1
where purchLine.someId1 == someTable1.someId
join someTable2
where purchLine.someId2 == someTable2.someId
join someTable3
where purchLine.someId3 == someTable3.someId
...
{
some action
}
А здесь ответ уже далеко не однозначен.
По идее надо бы еще говорить о плане запроса и о кэшировании запросов на СКЛ... О том, насколько лучше СКЛ оптимизирует простые запросы (даже если их много) по сравнению со сложными (но редкими).
Кроме этих соображений есть еще одно - только первый вариант позволит сделать универсальный и развесистый код. Только первый вариант позволит скрыть детали реализации.
Вы пишете свой метод для работы с номенклатурой внутри цикла по строкам закупки. Ваш метод получает в качестве параметра код номенклатуры. Как эту номенклатуру получили вас в вашем методе не волнует. Ваш метод занимается только своей работой. В таком случае бывает удобнее внутри вашего метода сделать лишний find.