|
Оптимизация обращений к реквизитам объектов через точку | ☑ | ||
---|---|---|---|---|
0
ИС-2
naïve
27.12.17
✎
13:40
|
В базе сделана куча проверок, где идет обращение к реквизитам через точку.
Например, Заказ.Договор.Владелец.ИНН Это съедает скорость работы. Одна проверка через такое обращение занимает 38%. Вопрос. Как это можно оптимизировать? Переводить на запросы - долго и не факт, что даст скорость работы. 1) Написание общей функции повторного использования, которая делает обращение к промежуточным данным (чтобы минимизировать вероятность получения устаревших данных). Примерно так: ПовтИсп.ЗначениеРеквизита(Заказ,"Договор.Владелец").ИНН есть еще какие-то варианты? |
|||
1
SergeyKB
27.12.17
✎
13:43
|
переделывание на формат БСП
ЗначениеРеквизитаОбъекта и подобные функции |
|||
2
ildary
27.12.17
✎
13:59
|
(1) а ЗначениеРеквизитаОбъекта() умеет получать данные через точку?
|
|||
3
triviumfan
27.12.17
✎
14:11
|
1) предварительно получить все необходимые реквизиты перед проверками;
2) перейти на табличную модель получения данных, т.к. у тебя наверняка обращения к составным типам присутствуют (вижу "Владелец" в примере), что влечёт за собой избыточные внутренние соединения; 3) 38% - это данные замера производительности? Может проблема в конкретной строчке кода, где идёт обращение к реквизитам составного поля? |
|||
4
Tateossian
27.12.17
✎
14:25
|
(0) Можно укоротить разыменование:
Заказ.Договор.Владелец.ИНН -> Заказ.Контрагент.ИНН :) Если все проверки примерно по такой схеме, как ты написал, можно предложить сделать универсальную функцию, что-то вроде СтруктураШапкиДокумента и там держать все необходимые реквизиты. Не думаю, что прямо особых случаев много. Есть еще вариант, но слегка костыльный - все проверяемые реквизиты прописать в объекте Критерии отбора - он очень быстро работает и лишних чтений не будет, но немножко станет толще база. |
|||
5
RomaH
naïve
27.12.17
✎
14:25
|
"Переводить на запросы - долго и не факт, что даст скорость работы."
скорость работы даст в любом случае чтобы минимизировать вероятность получения устаревших данных - хранить на время вызова - насколько я понимаю это аналогично запросу |
|||
6
triviumfan
27.12.17
✎
14:35
|
Если предположить, что многие данные уже храняться в оперативной памяти, то с вероятностью 146% можно сделать вывод, что причина падения производительности в одной из строк рукоблудного кода :)
|
|||
7
ИТ директор
27.12.17
✎
14:39
|
(0) посмотри на картинку у меня в профиле, это результат работы 1С-ников таких как ты
|
|||
8
H A D G E H O G s
27.12.17
✎
14:45
|
(7) Милота то какая.
|
|||
9
Kigo_Kigo
27.12.17
✎
14:46
|
А я вот знаю про что ТС-говорить, это регистры покупатели и поставщики? туда не пишется контрагент, а только договор, оптимизировать получится только добавив контрагента в регистр, прописать его туда в модулях проведения доков, свернуть базу, оставшиеся доки перевровести, тугие отчеты переписать, точнее дописать выборки по контрагенты
|
|||
10
H A D G E H O G s
27.12.17
✎
14:47
|
(9) дикость какая.
|
|||
11
Asmody
27.12.17
✎
14:48
|
(7) Руки-то целы?
|
|||
12
Asmody
27.12.17
✎
14:49
|
(0) Закешировать. Способов вагон.
|
|||
13
Kigo_Kigo
27.12.17
✎
14:53
|
(10) Всмысле?
|
|||
14
H A D G E H O G s
27.12.17
✎
14:59
|
(13) Нет ничего страшного прицепить через точку Владельца Договора.
|
|||
15
Kigo_Kigo
27.12.17
✎
15:01
|
(14) при больших объемах, иногда до 60% времени сжирает Владелец()
|
|||
16
vicof
27.12.17
✎
15:05
|
Заказ.Договор.Владелец.ИНН
Почему не проверять ИНН перед записью контрагента? |
|||
17
Shrek_yar
27.12.17
✎
15:11
|
(1) что за формат БСП? ЗначениеРеквизитаОбъекта и подобные функции
о_О |
|||
18
ildary
27.12.17
✎
15:14
|
(17) ЗначениеРеквизитаОбъекта() - это БСП-шная функция.
|
|||
19
Ботаник Гарден Меран
27.12.17
✎
15:22
|
Определиться с составом реквизитов. При первом обращении к объекту получить запросом все нужные реквизиты. Кэшировать. Все последующие обращения по объекту брать из кэша.
|
|||
20
ИТ директор
27.12.17
✎
15:24
|
(19) А если данные изменятся, т.е. кэш протухнет?
|
|||
21
Ботаник Гарден Меран
27.12.17
✎
15:27
|
(20)
Есть такая проблема. Только вчера в УХ ответственных лиц через модуль повторного использования получал. Заполнил регистр и долго втыкал, почему пусто в отчете. Зависит от продолжительности проверки. |
|||
22
Zamestas
27.12.17
✎
15:27
|
(0) Запросами не?
|
|||
23
Dmitrii
гуру
27.12.17
✎
15:27
|
(0) Для таких целей в модуле ОбщегоНазначения есть целая кучка функций:
ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь) ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) ЗначенияРеквизитовОбъектов(МассивСсылок, ИменаРеквизитов, ВыбратьРазрешенные = Ложь) ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные = Ложь) >> Написание общей функции повторного использования Вряд ли даст результат, т.к. редко будет вызываться с одними и теми же входящими параметрами несколько раз подряд. А при каждом вызове с новыми входными параметрами повторно использоваться ранее сохраненные значения не будут. Таким образом выигрыша не будет. Только память забиваться будет на хранение повторно используемых значений. Если подходить глобально, то верно написано в (19). Но для этого надо значительно больше переписать кода. |
|||
24
ИТ директор
27.12.17
✎
15:33
|
(23) Если подходить глобально, то надо делать рефакторинг метаданных или денормализацию, например забубенивать всякие регистры сведений с нужными разрезами. Но это уже если исправления кривых запросов не поможет.
|
|||
25
hhhh
27.12.17
✎
15:36
|
(19) всё уже закэшировано до нас. Вы и правда думаете, что платформа у себя не кэширует?
|
|||
26
Dmitrii
гуру
27.12.17
✎
15:37
|
(24) Такой глобальный пересмотр методики учета для большинства типовых просто нереален. Или будет означать отказ от дальнейшего обновления от поставщика.
|
|||
27
Ботаник Гарден Меран
27.12.17
✎
15:38
|
(25)
Кэш через три точки? Ну может быть, у меня таких точных познаний нет. (24) Будет тормозить на записи регистров сведений с нужными разрезами. |
|||
28
Fragster
гуру
27.12.17
✎
15:39
|
(7) запрос-то выполнился?
|
|||
29
ИТ директор
27.12.17
✎
15:40
|
(26) Типовые от 1С и не нуждаются в подобной переделке, т.к. спроектированы по большей части хорошо. В отличие от отраслевых поделок франчей, вот уж где трэш и угар.
|
|||
30
H A D G E H O G s
27.12.17
✎
15:41
|
(23) Я использую обертку повторновозвращаемых над ЗначениеРеквизитаОбъекта
помогает не городить свой кэш при групповых массовых обработках |
|||
31
H A D G E H O G s
27.12.17
✎
15:41
|
(29) ха^3
|
|||
32
Fragster
гуру
27.12.17
✎
15:43
|
(31) да ладно, там даже получение остатков по партиям уже поправили.
|
|||
33
perester
27.12.17
✎
15:44
|
(26) можно расширениями все сделать, даже не дожидаться режима совместимости)
|
|||
34
Fragster
гуру
27.12.17
✎
16:00
|
(31) как тебе такое: https://forum.infostart.ru/forum34/topic180290/#message1904747
|
|||
35
H A D G E H O G s
27.12.17
✎
16:03
|
(34) Ну если только КЛАДРы жать.
|
|||
36
H A D G E H O G s
27.12.17
✎
16:04
|
(34) Ставлю дайм, это очень оценили на партнерском
|
|||
37
H A D G E H O G s
27.12.17
✎
16:04
|
А как бы годно было бы дать возможность жать справочники и РС
|
|||
38
ИТ директор
27.12.17
✎
16:05
|
(34) для тех кто держит тестовые базы в продуктиве (да-да, я про тебя), наверно актуально
|
|||
39
Fragster
гуру
27.12.17
✎
16:07
|
(38) денег нет, но мы держимся
![]() |
|||
40
youalex
27.12.17
✎
16:08
|
(20) если это принципиально, то и результат проверки через точку может протухнуть.
(27) кэш объектов. Заказ.Договор.Владелец.ИНН = Заказ.ПолучитьОбъект().Договор.ПолучитьОбъект().Владелец.ПолучитьОбъект().ИНН. все полученные объекты будут закэшированы платформой. |
|||
41
Fragster
гуру
27.12.17
✎
16:09
|
(40) если совсем принципиально, можно управляемую блокировку на цепочку ссылок повесить...
|
|||
42
rs_trade
27.12.17
✎
16:09
|
(34) а индексы че не пожал?
|
|||
43
Fragster
гуру
27.12.17
✎
16:09
|
(42) пожал
|
|||
44
ИТ директор
27.12.17
✎
16:10
|
(39) у вас еще и сервер 1С вместе с сервером СУБД на одной железке?
|
|||
45
Fragster
гуру
27.12.17
✎
16:12
|
(44) там еще и железку альтернативные выбирали... ну хоть на ssd...
![]() |
|||
46
Fragster
гуру
27.12.17
✎
16:12
|
![]() |
|||
47
rs_trade
27.12.17
✎
16:12
|
(43) я слепой. увидел.
|
|||
48
youalex
27.12.17
✎
16:13
|
(41) тогда и транзакцию прицепом) А проверять реки на что-то там, скорее всего, можно полностью в запросе
|
|||
49
Fragster
гуру
27.12.17
✎
16:13
|
(48) таки ты прав
|
|||
50
H A D G E H O G s
27.12.17
✎
16:14
|
(46) Мы выключили виртуализацию.
|
|||
51
Fragster
гуру
27.12.17
✎
16:16
|
(50) ты не поверишь, но на этом серваке еще есть и виртуалка с какой-то хуйней. Деть некуда, см (39), но хоть нагрузки не дает хоть как-то ощутимой.
|
|||
52
Fragster
гуру
27.12.17
✎
16:16
|
*фигнёй
|
|||
53
rs_trade
27.12.17
✎
16:26
|
(34) скрипт можно еще доработать. боле умным сделать.
|
|||
54
Fragster
гуру
27.12.17
✎
16:28
|
(53) например? смотреть соотношение чтения записи и estimated сжатие?
|
|||
55
Fragster
гуру
27.12.17
✎
16:29
|
ИТ директор , см Что быстрее соединение или В бывает еще хуже :)
|
|||
56
rs_trade
27.12.17
✎
16:31
|
(54) ага. это читал? https://msdn.microsoft.com/en-us/library/dd894051(v=sql.100).aspx
я хотел наваять, но ленюсь. |
|||
57
Fragster
гуру
27.12.17
✎
16:35
|
(56) супер. на выходных добью скрипт :)
|
|||
58
ИС-2
naïve
28.12.17
✎
10:00
|
вытащить все данные запросом может потребоваться еще больше времени т.к надо соединять все таблицы
|
|||
59
D3O
28.12.17
✎
10:28
|
(58) если соединять с предварительно отобранными временными таблицами больше времени не потребуется.
платформа при обращениях из языка через точно выбирает весь кортеж объекта, а не только требуемое поле. проблема быстродействия еще и в этом. |
|||
60
D3O
28.12.17
✎
10:29
|
*через точку
|
|||
61
Fragster
гуру
28.12.17
✎
10:37
|
(59) а если объект содержит таб части, то (раньше - так точно) делает это в микротранзакциях
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |