24.04.2015, 13:41 | #1 |
Участник
|
Find() vs Select
Добрый день.
Возник спор с разработчиками компании-внедренца: какую конструкцию лучше использовать для display-метода возвращающего например имя клиента. Мой вариант: X++: return CustTable::find(accountNum).Name; X++: select Name from CustTable where CustTable.AccountNum == accountNum; return CustTable.Name; Кто прав в итоге? |
|
24.04.2015, 13:47 | #2 |
Мрачный тип
|
Они
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
24.04.2015, 13:51 | #3 |
Участник
|
Т.е. правильней везде вместо find писать select?
|
|
24.04.2015, 13:55 | #4 |
Участник
|
как хорошо что возникают такие споры, значит других проблем особо нет
|
|
24.04.2015, 14:12 | #5 |
Гость
|
|
|
24.04.2015, 14:12 | #6 |
северный Будда
|
слово "правильней" здесь весьма дискуссионно, ибо очень сильно зависит от того, что именно вам нужно. Если у вас настолько слабый сервер, что замена find на select даёт существенный рост производительности, то замена оправдана.
__________________
С уважением, Вячеслав |
|
24.04.2015, 14:18 | #7 |
Участник
|
Или наоборот, куча сил уходит на такую ерунду, а модель расчета себестоимости за неделю до запуска обсуждают
Цитата:
В целом вариант партнера дает более предсказуемый результат, find в дисплей-методе - это точно BP? Можно ссылку?
__________________
Ivanhoe as is.. |
|
24.04.2015, 14:52 | #8 |
Участник
|
Если бы вы выбирали кучу записей, то были правы бы они (меньший объем данные передавался бы в итоге по сети)
А в случае поиска единичной записи - правильнее find. Тем более что этот справочник наверняка кешируется ядром и тогда независимо от того как вы пишете - find или X++: select Name from CustTable where CustTable.AccountNum == accountNum; Плюс на уровне БД все равно с диска будет читаться страничка целиком где не только все поля лежат рядом но и куча рядом лежащих записей. |
|
|
За это сообщение автора поблагодарили: trud (1), AvrDen (1), gl00mie (2). |
24.04.2015, 14:53 | #9 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: AvrDen (1). |
24.04.2015, 15:07 | #10 |
Участник
|
C железом проблем нет. На предприятии при наличии метода find() на таблице всегда отдавалось предпочтение ему. А сейчас будет получаться "винигрет", хотелось бы придерживаться единого стандарта.
|
|
24.04.2015, 15:10 | #11 |
Участник
|
Цитата:
Сообщение от Logger
Если бы вы выбирали кучу записей, то были правы бы они (меньший объем данные передавался бы в итоге по сети)
А в случае поиска единичной записи - правильнее find. Тем более что этот справочник наверняка кешируется ядром и тогда независимо от того как вы пишете - find или X++: select Name from CustTable where CustTable.AccountNum == accountNum; Плюс на уровне БД все равно с диска будет читаться страничка целиком где не только все поля лежат рядом но и куча рядом лежащих записей. |
|
24.04.2015, 15:23 | #12 |
Участник
|
Для display метода вариант компании-внедренца более правильный - так как есть BP по использованию списков полей.
PS: Приведенный пример кода компании-внедренца безграмотный. |
|
24.04.2015, 16:10 | #13 |
Участник
|
По-другому может не сработать Уменьшение кол-ва полей в запросе
|
|
24.04.2015, 16:47 | #14 |
Участник
|
Кстати, есть еще зависимость от кода в методе CustTable::find(). Если не ошибаюсь, то в ранних версиях Axapta была безусловная настройка
X++: custTable.selectForUpdate(_forUpdate); X++: if (_forUpdate)
custTable.selectForUpdate(_forUpdate); А вообще, конечно, "лучше безобразно, зато единообразно". Раз для поиска одной записи используется find(), то его всегда и везде и следует использовать. Меньше будет проблем с поддержкой.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: macklakov (1). |
24.04.2015, 17:50 | #15 |
Участник
|
Находил вот это описание
https://msdn.microsoft.com/en-us/library/aa879893.aspx Т.е. для поиска ОДНОЙ записи по ключу рекомендуется использовать find(). |
|
|
За это сообщение автора поблагодарили: macklakov (1), Ivanhoe (1). |
24.04.2015, 17:54 | #16 |
Участник
|
|
|
24.04.2015, 18:17 | #17 |
Участник
|
Цитата:
Сообщение от Logger
Тем более что этот справочник наверняка кешируется ядром и тогда независимо от того как вы пишете - find или
X++: select Name from CustTable where CustTable.AccountNum == accountNum; Плюс на уровне БД все равно с диска будет читаться страничка целиком где не только все поля лежат рядом но и куча рядом лежащих записей.
__________________
Ivanhoe as is.. |
|
28.04.2015, 19:15 | #18 |
Участник
|
Гоните в шею таких внедренцев! Прирост в скорости - сотые доли процента. Метод find() должен быть на каждой таблице с уникальным индексом. Это обсуждалось неоднократно и записано в скрижалях по BP на первом месте. И если он есть, надо использовать. Если будете писать везде SELECT'ы, ваш код превратится в странно попахивающую кучу. Вы потом и сами будете неудобно себя чувствовать, показывая свой код другим.
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: macklakov (1). |
28.04.2015, 20:03 | #19 |
Участник
|
тоже отвечу, впрочем до меня уже все разжевали
лучше использовать find. не из-за производительности (как заметили верно - она если и различается, то несущественно) главная причина: код короче и яснее, меньше вероятность ошибки |
|