|
![]() |
#1 |
Участник
|
Как указал glibs кеширование влияет на производительность. Но здесь нет однозначного ответа.
По умолчанию, у InventTable режим кеширования Found. Т.е. кешируются только те записи, к которым было обращение (поиск). Следовательно, этот режим кеширования имеет смысл оставить, если каждый пользователь работает в основном с небольшим набором номенклатуры. Или сам справочник номенклатуры небольшой. Если же большинство пользователей работает со всей картотекой номенклатуры, то нет никакого смысла в кешировании. У нас кеширование InventTable отключено. Справочник порядка 50 тысяч позиций. Проблем нет. Хотя, удаление записей запрещено ![]() Цитата:
Сообщение от Eldar9x
И вообще, я не понимаю, для чего это проверка там вставлена? В inventTable есть уникальный индекс по ItemId, зачем еще этот код?
Если оставить только индекс, то, во-первых, нет возможности "рулить" текстом сообщения об ошибке, а, во-вторых, будет выполнена куча лишних проверок до попытки сброса изменений в таблицу. Думаю, добавятся еще проблемы со связанными таблицами, но здесь не уверен. Собственно, можно попробовать вообще убрать эту проверку и посмотреть к чему это приведет в случае попытки создания дубля. |
|
|
За это сообщение автора поблагодарили: Eldar9x (2). |
![]() |
#2 |
Member
|
Цитата:
Сообщение от Владимир Максимов
...
кеширование влияет на производительность. Но здесь нет однозначного ответа ... Если же большинство пользователей работает со всей картотекой номенклатуры, то нет никакого смысла в кешировании. ... InventTable::find(...) А точнее, когда запись выбирается по первичному ключу. Если код работает на сервере приложений, то в таком случае будет лишнее обращение на сервер БД. Номенклатура там скорее всего будет тоже в кеше, поэтому потери производительности вы можете не ощутить визуально. Впрочем, если запускается долгоиграющая периодическая процедура (типа закрытия склада), в которой может очень-очень много раз вызываться InventTable::find(...) подразумевая, что кеширование включено, производительность может просесть заметно. Не говоря уже о лишнем трафике (Аксапта имеет привычку выбирать все поля в записи). Если же код будет выполняться на клиенте (display методы, если по-хорошему), то потеря производительности при отключении кеширования будет заметна даже невооруженным глазом. Когда я был помоложе, то тоже увлекался отключением кеширования. Но все-таки пришел к тому, что не стоит. Вот вам джоб. X++: static void glibs(Args _args) { InventTable inventTable; Counter i; TimeOfDay startTime, endTime; ; startTime = timenow(); for (i = 1; i <= 10000; i++) { inventTable = InventTable::find("Test"); } endTime = timenow(); info (strfmt("%1", endTime - startTime)); } У меня разница приблизительно на порядок получилась.
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#3 |
Участник
|
glibs
Я же говорю, нет однозначного ответа. Зависит от конкретной ситуации и надо смотреть "по месту" что выгоднее: возможная потеря производительности или актуальность данных. Для нас критичным оказалась именно актуальность данных. Почему? Это уже отдельный вопрос. По сути, единственное место, где реально ощутима потеря производительности - это display-методы. Коды циклических процедур все-таки не настолько "тупые", чтобы многократно делать поиск внутри цикла. А если настолько, то на этот случай и нужны программисты, чтобы это исправить ![]() Можно ведь сделать и "закат солнца вручную". В смысле, скидывать найденные записи во временную таблицу внутри цикла. Своеобразный локальный кеш получится. Насчет закрытия склада - не понял. Где там многократное обращение к одной и той же записи InventTable? Там же единственный цикл именно по InventTable, а потом выбранная запись передается как параметр. Нет повторного InventTable::find() |
|
Теги |
кэширование |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|