![]() |
#5 |
Участник
|
Цитата:
Сообщение от 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. |
|