Разыменования в коде (и прочее) - что при этом делает СУБД

0. 211 27.02.19 19:46 Сейчас в теме
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. tormozit 6234 28.02.19 07:21 Сейчас в теме
Рекомендую изучение подобной темы начинать с описания работы кэшей на ИТС:
- Объектный кэш
- Транзакционный кэш
- Кэш представлений ссылок
Также полезно техножурналом смотреть сначала запросы модели базы данных (SDBL), т.к. в них меньше "мусора" и лучше видна логика работы платформы.
Kinestetik; Rustig; Danil.Potapov; shtinalex; Vladimir Litvinenko; Jestery; asdf_88; kalyaka; jif; +9 Ответить
2. ImHunter 211 28.02.19 07:28 Сейчас в теме
(1) Это все понятно:) Но мое стремление было - увидеть своими глазами, что делает СУБД. Ибо документация может и не отражать всех особенностей.
4. tormozit 6234 28.02.19 09:10 Сейчас в теме
Своими глазами ты например не увидел проверку в СУБД версии данных при обращении к объекту, находящемуся в объектном кэше.
5. ImHunter 211 28.02.19 09:19 Сейчас в теме
(4) Видел вполне себе... Все-пре-все наблюдения - не было целью описать.
6. tormozit 6234 28.02.19 09:22 Сейчас в теме
(5) Ну статья же вроде обещает рассказать "что при этом делает СУБД". Считаю, что без упоминания запроса проверки версии данных статья лишена важного элемента.
narutouzumaki_13; buganov; zhichkin; headMade; +4 Ответить
7. ImHunter 211 28.02.19 09:24 Сейчас в теме
(6) Принято. Подумаю, как дополнить. Но с другой стороны, такими проверками особо не порулить.
narutouzumaki_13; CratosX; +2 Ответить
16. VVi3ard 50 10.04.19 17:50 Сейчас в теме
Статья как уже заметил (1) не достаточно объективная.

Что решит обычный разработчик прочитав ее?
"Получать через точку не выгодно".

А на самом деле зачастую выгоднее получать через "." особенно если объект это какой то НСИ который редко меняется.
Т.к. с высокой долей вероятности значение всех полей уже есть в кэше и чтение из БД не потребует чтения из базы.
В то время как использование функций БСП гарантированно приводит к чтению данных.

Так например обращение к реквизиту формы через "." с вероятностью 90% приведет к чтению кэша а не к получению данных из ИБ.


Думаю что для полноты статьи нужно провести эксперименты с учетом кэширования.
JohnConnor; Rustig; +2 Ответить
26. buganov 156 07.06.19 12:58 Сейчас в теме
(16) Уот так уот, оказывается методами БСП невыгодно получать реквизит. Нонсенс!
Давайте поможем Даше получить оптимальнее контрагента из ссылки на заказ.
Вариант 1. Через точку. При этом считаются все реквизиты, табличные части из СУБД. В лучшем случае из кеша. Но в кеш то надо еще получить!
Вариант 2. Управляемый. С помощью запроса за 3 мс получить значение нужного реквизита без мусора. Гарантировано всегда быстро.

Ах да, писатели типовых ведь сплошь стажеры, придумали фигню, лучше бы всю базу в кеш затолкали, а чего, быстро же будет!
shalimski; mickey.1cx; +2 2 Ответить
3. w.r. 590 28.02.19 08:38 Сейчас в теме
Как бы известно, что если по ссылке получаешь реквизит, например:

ЗаказСсылка.Номер

то из СУБД считывается целиком объект со всеми реквизитами и табличными частями

поэтому, если нужно считать 1 или несколько реквизитов из сложного объекта, типа документа, то рекомендуют делать это через Запрос

https://its.1c.ru/db/metod8dev/content/2717/hdoc
Rustig; asdf_88; +2 Ответить
8. Glebis 11 28.02.19 09:27 Сейчас в теме
А какие поля опрашиваются при вызове метода "Представление" в запросе?
anton3077944; +1 Ответить
9. ImHunter 211 28.02.19 09:29 Сейчас в теме
(8) Точно! Хотел ведь глянуть итоговый такой запрос. К концу сегодня (28.02) докину пример.
anton3077944; +1 Ответить
12. Darklight 27 28.02.19 10:08 Сейчас в теме
(9)Не забудьте заодно и про метод "ПРЕДСТАВЛЕНИЕССЫЛКИ" и про свойство ".Представление"
anton3077944; +1 Ответить
11. Darklight 27 28.02.19 10:05 Сейчас в теме
10. Darklight 27 28.02.19 10:00 Сейчас в теме
Про обращение к константе добавь
Про разделители напиши
Про то, как изменятся запрос при применении RLS тоже важно было бы упомянуть
13. strek_ivan 77 28.02.19 12:19 Сейчас в теме
В БСП с целью оптимизации обращения с СУБД как раз и используется
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь).

Не пренебрегайте этой функцией и, тем самым, сократите время выполнения кода.
Rustig; user764477; Jestery; +3 Ответить
15. user710334_koshil.v 20.03.19 12:15 Сейчас в теме
Попытался. В самописную конфу вставил функцию из БСП.
Задача: приСозданииНаСервере() в реквизит "кладовщик" прописать значение реквизита "сотрудник" справочника "Пользователи". Ссылка на пользователя находится в параметре сеанса "ТекущийПользователь":

p.s. неудачно скриншоты получились.
Там где обращение тупо кладовщикВыдачи = ПараметрыСеанса.ТекущийПользователь.Сотрудник время 0,003309, а там где КладовщикВыдачи = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПараметрыСеанса.ТекущийПользователь,"Сотрудник"); время 0,039332 - ровно на порядок. Может пример неудачный?
Прикрепленные файлы:
14. ImHunter 211 28.02.19 17:34 Сейчас в теме
Дописал про ПРЕДСТАВЛЕНИЕССЫЛКИ / ПРЕДСТАВЛЕНИЕ.
zhichkin; Evg-Lylyk; +2 Ответить
17. acanta 10.04.19 18:05 Сейчас в теме
Кэширование повышает риск недостоверности данных. оптимизируется не скорость, а надежность.
18. vasilev2015 1987 04.06.19 11:52 Сейчас в теме
Здравствуйте !

я не верю, что Сообщить(Строка(Валюта)); не считывает весь объект. Вы запускали эту команду первой, или Вы запускаете ее, когда объект помещен в кэш ?
19. ImHunter 211 04.06.19 12:54 Сейчас в теме
(18) Я писал в публикации, что при нескольких разыменованиях используется кеширование.
А вообще, я вопрос не понял. Во что вы таки не верите?
20. vasilev2015 1987 04.06.19 13:01 Сейчас в теме
(19) я считаю, что Сообщить(Строка(Валюта)); должен считать весь объект, если раньше не было объектного чтения для переменной "Валюта". Profiler мне пока недоступен.
21. ImHunter 211 04.06.19 13:23 Сейчас в теме
(20) Ну не знаю:) Запросы из профайлера, вам, видимо, не аргумент. Но и ваш аргумент "не верю" - слабоват. Поэтому либо верьте, либо не верьте, либо проверяйте тех.журналом.
22. vasilev2015 1987 04.06.19 13:30 Сейчас в теме
(21) запросы из Профайлера для меня нормальный аргумент. Я просто спрашиваю: было ли перед командой Сообщить(Строка(Валюта)) объектное чтение переменной Валюта или нет ?
23. ImHunter 211 04.06.19 13:37 Сейчас в теме
(22) Нет, конечно. Ведь основная цель была не в исследовании кеширования.
27. gubanoff 50 10.06.19 17:37 Сейчас в теме
(18) для случая Сообщить(Валюта) точно не считывает - в этом случае платформа понимает, что нужно получить только представление объекта, оно кэшируется. А вот для случая преобразования в строку - это вопрос, но он по сути не имеет смысла, т.к. этот код в любом случае методическая ошибка.
24. dock 43 07.06.19 01:40 Сейчас в теме
Хотелось бы такой же проверки для более новых версий платформы (8.3.14 - 8.3.15)
Могу ошибаться, но вроде как обещали изменить поведение при чтении стандартных реквизитов (номер, дата и т.д.)
25. ImHunter 211 07.06.19 06:10 Сейчас в теме
(24) Про изменение поведения тоже краем уха слышал. Для себя спланировал, что как выйдет следующий релиз 14 платформы (после 1779), так и займусь.
28. ImHunter 211 03.12.19 18:38 Сейчас в теме
(24) Планирую заняться подобными исследованиями на 8.3.16.1063.
Кому что интересно - пишите.

Пока что в ближайших планах - проверить вычитывание ТЧ и стандартные реквизиты (код, номер, дата).
Прошу не писать про кеширование - по максимуму буду избегать его использование.
29. ImHunter 211 23.12.19 17:10 Сейчас в теме
Немного покопался с 8.3.16.1063 - дописал маленькую Часть 2 в этой публикации.
Оставьте свое сообщение
Вопросы с вознаграждением