Тема: find() vs. join
Показать сообщение отдельно
Старый 24.11.2005, 23:40   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от 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.
__________________
полезное на axForum, github, vk, coub.