24.11.2005, 17:43 | #1 |
Участник
|
find() vs. join
Возник вопрос: что производительнее
while select purchLine { inventTable = InventTable::find(PurchLine.itemId); some action; } или while select purchLine join inventTable where purchLine.ItemId == inventTable.ItemId { some action } ? |
|
24.11.2005, 18:08 | #2 |
Administrator
|
гым... ну если нет никаких подводных камней - то по идее - первый вариант по определению дольше; существенно дольше. Связано это с тем что во втором случае исполняется один SQL-запрос, а в первом - по кол-ву записей в purchTable. А вообще-то есть профайлер - он более точно даст ответ.
В частности аналогичная ситуация в Transact-SQL для SQL Server однозначно решается в пользу второго варианта. По сути - почему народ часто переписывает какие-л закрытия или пересчеты - потому что в Аксапте исключение дублирования кода и облегчение дальнейшего сопровождения зачастую идет в ущерб производительности. И дело не столько в Аксапте - сколько в том, что не все можно соптимизировать и при этом написать общий код на все случаи жизни.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 24.11.2005 в 18:12. |
|
24.11.2005, 18:35 | #3 |
Участник
|
а кеширование?
|
|
24.11.2005, 19:04 | #4 |
Участник
|
Цитата:
Сообщение от belugin
а кеширование?
Да и не всегда возможно InventTable закешировать. |
|
24.11.2005, 23:40 | #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. |
|
25.11.2005, 10:59 | #6 |
Участник
|
Всем спасибо, вцелом все прояснилось, для конкретных же случаев без профайлера, похоже, не обойтись.
|
|
26.11.2005, 15:36 | #7 |
Administrator
|
Цитата:
Сообщение от otkudao
если Вы не "системщик" в Аксапте, а "прикладник", т.е. пишете на слое cus-usr, то универсальность в ущерб производительности НЕДОПУСТИМАЯ роскошь.
Цитата:
Сообщение от otkudao
Указанные запрос - не супер сложный. Кроме того, медленные предикаты СКЛя Аксапта попросту не пропускает (хэвинг), если мне не изменяет память.
Цитата:
Сообщение от otkudao
Т.е. супер-сложный-долгий запрос у Вас создать не получится.
Цитата:
Сообщение от otkudao
Мало того, берусь утверждать, что самое скромное кол-во простых запросов взамен сложного по тому же результату будет НА ПОРЯДКИ дольше в исполнении-получении.
Цитата:
Сообщение от otkudao
...подтверждено пунктом 1 раздела Оптимизация Бест практис.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|