Имя: Пароль:
1C
1С v8
Кэши разные нужны, кэши нужные важны.
,
0 H A D G E H O G s
 
20.03.13
16:32
День добрый.
Понял, что заблуждался.
Строка кода
Артикул=Номенклатура.Артикул (1);

создает объектный кэш.
Кэш живет 20 МИНУТ (как оказалось), но через 20 секунд проверяется на валидность считывание поля _version из базы.
http://langslab.com/ebooks/prof-dev2/tome1/pr-dev-t1-ch04

Все нормально, все логично, пока.

Заходим в профайлер и видим, что если мы выполним код (1) ранее чем за 20 секунд - ничего не произойдет, а если после 20 секунд - выполниться 2! запроса:

Первый запрос:

exec sp_executesql N'SELECT
T1._Version
FROM _Reference152 T1
WHERE T1._IDRRef = P1',N'P1 varbinary(16)',0x8041A8E513C95CF74D0C57393F6E2FDB


Второй запрос:

exec sp_executesql N'SELECT
T2._IDRRef,
T2._Version,
T2._Marked,
T2._IsMetadata,
T2._ParentIDRRef,
T2._Folder,
T2._Code,
T2._Description,
T2._Fld2303,
T2._Fld2304RRef,
T2._Fld2305,
T2._Fld2306,
T2._Fld2307,
T2._Fld2308,
T2._Fld2309,
T2._Fld2310,
T2._Fld2311,
T2._Fld2312RRef,
T2._Fld2313RRef,
T2._Fld2314RRef,
T2._Fld2315RRef,
T2._Fld2316,
T2._Fld2317,
T2._Fld2318RRef,
T2._Fld2319,
T2._Fld2320RRef,
T2._Fld2321RRef,
T2._Fld2322RRef,
T2._Fld2323RRef,
T2._Fld2324RRef,
T2._Fld2325RRef,
T2._Fld2326RRef,
T2._Fld2327RRef,
T2._Fld2328RRef,
T2._Fld2329,
T2._Fld2330,
T2._Fld2331,
T2._Fld2332,
T2._Fld2333,
T2._Fld2334RRef,
T2._Fld2335RRef,
T2._Fld2336RRef,
T2._Fld2337RRef,
T2._Fld2339,
T2._Fld2340,
T2._Fld2341RRef,
T2._Fld2342RRef,
T2._Fld2343RRef,
T2._Fld2344RRef,
T2._Fld2345_TYPE,
T2._Fld2345_RTRef,
T2._Fld2345_RRRef,
T2._Fld2346_TYPE,
T2._Fld2346_RTRef,
T2._Fld2346_RRRef,
T2._Fld2347,
T2._Fld2348,
T2._Fld2349,
T2._Fld2350,
T2._Fld2351RRef,
T2._Fld2352RRef,
T2._Fld2353RRef,
T2._Fld2354_TYPE,
T2._Fld2354_S,
T2._Fld2354_RRRef,
T2._Fld2355RRef,
T2._Fld2356RRef,
T2._Fld2357,
T2._Fld2338,
T2._Fld2358RRef,
T2._Fld2359RRef,
T2._Fld2360RRef,
T2._Fld24140RRef,
T2._Fld24141_TYPE,
T2._Fld24141_RTRef,
T2._Fld24141_RRRef,
T2._Fld27221,
T2._Fld27222,
0 AS SDBL_IDENTITY
FROM _Reference152 T2
WHERE T2._IDRRef = P1 AND T2._Version <> @P2',N'P1 varbinary(16),@P2 varbinary(8)',0x8041A8E513C95CF74D0C57393F6E2FDB,0x0000000000E96026


И вот тут то начинаются загадки...
120 H A D G E H O G s
 
29.03.13
12:33
(118) Ты нихера не ответил.
121 Odavid
 
29.03.13
12:37
(120) вы просто не хотите читать.
А хотите верить и дальше, что 1С - великая сситема.
А не набор поделок на коленке.
Вы хотите получить ответ, совмещающий как реализацию кэша (как области хранения и быстрой выборки часто используемых данных), так и прямо противоположные этому результаты работы 1С-севрера (и данные профайлера), которые видите перед собой.
А так НИКОГДА НЕ ПОЛУЧИТСЯ.
Нужно чем-то поступиться - либо определение кэша сместить в "понятия 1С", либо - признать, что ошибался всю сознательную деятельность работы с 1С :)))
122 H A D G E H O G s
 
29.03.13
12:38
(121) Иди, убей себя ап стену, балаболка.
123 Odavid
 
29.03.13
12:40
(114)>>значит данные не хранятся в кэше и они запрашиваются постоянно в базульку
- именно это и подтверждается всеми данными, в том числе - выкладками    H A D G E H O G s.
Но очень трудно признаться себе в том, что тебя нагло и беспринципнро обманывали долгое время, а ты еще и радовался этому :)
124 Odavid
 
29.03.13
12:40
(122) это ты балаболка.
бестолковая :)
125 Odavid
 
29.03.13
12:41
получить данные и не суметь их объяснить - хуже, чем не получить.
Т.юе. ты не понимаешь вообще, что с чем и как работает.
Правда, в среде 1с это поощряется даже, и в не последнюю очередь - чтобы вот такими вопросами, как эта тема, не задавались.
126 Odavid
 
29.03.13
12:42
(122) вижу, ты уже убился.. бедняжка..
стена-то хоть не пострадала? :)
127 Odavid
 
29.03.13
12:48
(111)>>А если версия не изменилась?
- уже написано:
"Версия не изменилась - берет снова из кэша данные (и так в течении 20 минут)."
т.е. УЖЕ после того, как получены данные (второй запрос), сравнены версии, и выявлено, что версия не менялась.
"...потом - дает прирост, только если получение данных 1С-сервером из "своего" кэша быстрее, чем заново считанных."
Вы просто не хотите (или уже не умеете? ;) ) читать.
128 Odavid
 
29.03.13
12:55
+( 127) т.е., грубо говоря, данные кэша - хранятся в одной области памяти (диске), данные вновь полученной выборки для валидации (второй запрос) - в другой области.
И если 1С серверу "удобнее" и быстрее получить эти данные из "области" кэша - то прирост будет.
Если нет - прироста не будет.
ЧТо и подтверждено многочисленными практическими наблюдениями (прироста нет после 20 сек, т.к. обе "области" - примерно "равнодоступные" для сервера по быстродействию железа)
129 H A D G E H O G s
 
29.03.13
12:55
(128) Все, иди лесом, дятелъ.
130 Odavid
 
29.03.13
12:56
++ это и есть "понимание кэша" по 1С, если кто еще не понял :)
131 Odavid
 
29.03.13
12:56
(129) лесом уже ты пошел.
С поста так 10-го :)
И чем дальше - тем больше дров наломал.
132 Odavid
 
29.03.13
12:58
>>Все, иди лесом, дятелъ.
- чем бы 1сник не тешился - лишь бы не терял веры в 1С! :)
ну, и перейти на ругань - первейшее дело для 1сника.
133 H A D G E H O G s
 
29.03.13
13:00
(128) Чтобы ты немножко задумался зайчатками своего мозга - размер выборки второго запроса =0.
134 Зойч
 
29.03.13
13:03
Ребята, давайте жить дружно!
136 H A D G E H O G s
 
29.03.13
13:07
А про быструю и медленную часть сервера 1С - порадовало. Давненько такого не было.
138 Odavid
 
29.03.13
13:34
(136)>>А про быструю и медленную часть сервера 1С - порадовало
ну, а что еще тебя может порадовать - не поиск же ответа :)
Так, одна радость - себя показать, других посмотреть. Авось кто приметит....
139 Odavid
 
29.03.13
13:35
(135) ты "одинаково дружно" не дружишь даже сам с собой :)
140 H A D G E H O G s
 
29.03.13
13:37
(137) Конечно есть, если судить по (128):

грубо говоря, данные кэша - хранятся в одной области памяти (диске), данные вновь полученной выборки для валидации (второй запрос) - в другой области.
И если 1С серверу "удобнее" и быстрее получить эти данные из "области" кэша - то прирост будет.
Если нет - прироста не будет.


А если выполнить запрос в (0) - нет.
141 TormozIT
 
гуру
29.03.13
15:21
Внесу свои 5 копеек.
Исследование объектного кэширования считаю корректно проводить при следующих условиях
- в клиент-серверном варианте установив монопольный режим
- закрыты все формы, в которых может использоваться объектный кэш (отображаются ссылочные данные)
- с момента завершения предыдущего запуска прошло не менее 20 сек
- общая длительность теста для упрощения условия не должна превышать 20 сек

Я провел такой замер кодом

Сообщить(ТекущаяДата());
Количество = 1000;
ИмяСправочникаБезГрупп = Метаданные.Справочники.СвойстваМетаданных2iS.Имя;
ИмяПоля = "ПометкаУдаления";
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ " + XMLСтрока(Количество) + "
|    Т.Ссылка
|ИЗ
|    Справочник." + ИмяСправочникаБезГрупп + " КАК Т";
МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); //Готовим массив ссылок
Количество = МассивСсылок.Количество();
Сообщить("Размер выборки " + Количество);
УФ(сНачатьЗамер, Количество, "Подготовка объектного кэша");
Для Каждого Элемент ИЗ МассивСсылок Цикл
   Пустышка = Элемент[ИмяПоля];
КонецЦикла;
УФ(сЗакончитьЗамер);

УФ(сНачатьЗамер, Количество, "Чтение с использованием объектного кэширования");
Для Каждого Элемент ИЗ МассивСсылок Цикл
   Пустышка = Элемент[ИмяПоля];
КонецЦикла;
УФ(сЗакончитьЗамер);

УФ(сНачатьЗамер, Количество, "Чтение отдельными запросами");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Т.Ссылка,
|    Т." + ИмяПоля + "
|ИЗ
|    Справочник." + ИмяСправочникаБезГрупп + " КАК Т
|ГДЕ
|    Т.Ссылка = &Ссылка";
Для Каждого Элемент ИЗ МассивСсылок Цикл
   Запрос.УстановитьПараметр("Ссылка", Элемент);
   Пустыщка = Запрос.Выполнить().Выгрузить()[0][ИмяПоля];
КонецЦикла;
УФ(сЗакончитьЗамер);

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Т.Ссылка,
|    Т." + ИмяПоля + "
|ИЗ
|    Справочник." + ИмяСправочникаБезГрупп + " КАК Т
|ГДЕ
|    Т.Ссылка В(&МассивСсылок)";
Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
УФ(сНачатьЗамер, Количество, "Чтение общим запросом");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
   Пустыщка = Выборка[ИмяПоля];
КонецЦикла;
УФ(сЗакончитьЗамер);

И получил ожидаемый результат

Окончание замера "Подготовка объектного кэша" - Длительность = 8,144 с, Среднее = 0,008144 с
Окончание замера "Чтение с использованием объектного кэширования" - Длительность =  0с, Среднее =  0с
Окончание замера "Чтение отдельными запросами" - Длительность = 2,106 с, Среднее = 0,002106 с
Окончание замера "Чтение общим запросом" - Длительность = 0,078 с, Среднее = 0,000078 с
142 Serginio1
 
29.03.13
16:24
(141) Вообще то есть транзакционный кэш. Практика грязного чтения весьма порочна.
143 H A D G E H O G s
 
29.03.13
16:34
Замени

МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); //Готовим массив ссылок

на

МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); //Готовим массив ссылок

СходитьПокуритьВСекундах(22);
144 TormozIT
 
гуру
29.03.13
16:43
(143) Цитирую себя же из (141) "- общая длительность теста для упрощения условия не должна превышать 20 сек "
В предлагаемом варианте объектный кэш будет целиком перепроверен (количество обращений к серверу по идее будет таким же, как и при его заполнении).

Вот результаты

Окончание замера "Подготовка объектного кэша" - Длительность = 8.018 с, Среднее = 0.008018 с
Окончание замера "Чтение с использованием объектного кэширования до 20сек" - Длительность = 0.016 с, Среднее = 0.000016 с
Окончание замера "Чтение с использованием объектного кэширования после 20сек" - Длительность = 7.441 с, Среднее = 0.007441 с
Окончание замера "Чтение отдельными запросами" - Длительность = 2.215 с, Среднее = 0.002215 с
Окончание замера "Чтение общим запросом" - Длительность = 0.078 с, Среднее = 0.000078 с

Видно, что проверка актуальности данных объектного кэша лишь немногим быстрее чтения объекта в кэш.
145 H A D G E H O G s
 
29.03.13
16:53
(144) "лишь немногим быстрее чтения объекта в кэш."

Почти уверен, что справочник содержит ТЧ.
146 H A D G E H O G s
 
29.03.13
16:54
Если ТЧ не будет - разрыв будет существенней.
147 TormozIT
 
гуру
29.03.13
16:58
(145) Да, справочник был с ТЧ.
А вот почти та же картина на справочнике без ТЧ

Окончание замера "Подготовка объектного кэша" - Длительность = 6.988 с, Среднее = 0.006988 с
Окончание замера "Чтение с использованием объектного кэширования до 20сек" - Длительность = 0.016 с, Среднее = 0.000016 с
Окончание замера "Чтение с использованием объектного кэширования после 20сек" - Длительность = 6.77 с, Среднее = 0.00677 с
Окончание замера "Чтение отдельными запросами" - Длительность = 2.34 с, Среднее = 0.00234 с
Окончание замера "Чтение общим запросом" - Длительность = 0.078 с, Среднее = 0.000078 с
148 H A D G E H O G s
 
29.03.13
16:58
Воопщем, мне все понятно. Что ничего не понятно, зачем они так сделали.

И почему после 20 секунд выполняется попытка тащить с SQL обновленных данных, даже если их нет. А их нет, так как версия не изменилась. Но на innerjoin с ТЧ надо потратиться время.

А разница в 8.018сек- 7.441 с возникает из-за того, что
при 8.018сек - выборка не пуста, а при 7.441 - пуста.
149 H A D G E H O G s
 
29.03.13
17:00
(147) Значит я был не прав насчет InnerJoin
150 Serginio1
 
29.03.13
17:05
(147) Добавь время запроа на выборку несуществющих элементов. Например список кодов которых нет в базе. Тогда посмотрим сколько времения занимает второй запрос
151 H A D G E H O G s
 
29.03.13
17:07
(150) А это зачем?
152 TormozIT
 
гуру
29.03.13
17:08
Думаю чтение версии отдельно и всего объекта выполняются вместе, чтобы не делать новый запрос к серверу СУБД в случае если версия изменилась.

Предполагаю что алгоритм примерно такой, если прошло 20 сек
1. Строим запрос для чтения версии
2. Строим запрос для чтения объекта
3. Склеиваем 1+2 в пакет
4. Отправляем запрос в СУБД
5. Получаем результат пакета из СУБД
6. Если версия из результата запроса 1 не совпадает с версией в кэше, то берем результат запроса 2 и помещаем (обновляем) его в кэш.
7. Возвращаем объект из кэша.
153 Serginio1
 
29.03.13
17:08
Вернее не код а любой атрибут без индекса
эмуляция
Select * From T2
WHERE T2._IDRRef = P1 AND T2._Version <> @P2
154 H A D G E H O G s
 
29.03.13
17:08
(152) Но это же дикость!
155 H A D G E H O G s
 
29.03.13
17:09
(153) Понял.
156 Serginio1
 
29.03.13
17:10
(151) Ну у тебя то в итоге получается 2 запроса.
вот Чтение отдельными запросами это тогда когда запись изменена.
157 H A D G E H O G s
 
29.03.13
17:12
(156) И тогда, когда не изменена - тоже 2 запроса.
158 TormozIT
 
гуру
29.03.13
17:14
(154) Алгоритм в 152 я предложил, основываясь на твоих наблюдениях в (0). Сам пока не проверял. Возможно ты провел не очень чистый эксперимент. Действительно такой алгоритм кажется неоптимальным, т.к. изменения данных происходят гораздо реже, чем чтение.
159 Serginio1
 
29.03.13
17:15
(157) Я про то , что тест тянет все записи, а в реалии они не тянутся

Кста ответь на вопрос из v8: Чудеса с индексами.
что дает условие на равество =4.7 для SQL варианта.
В файловой версии возвращает 5. Там ясно что приведение через cast к Число.
А вот если в SQL вернет 4, то значит индексы хранятся ввиде int и приводятся к ште
160 H A D G E H O G s
 
29.03.13
17:16
(153) WHERE T2._IDRRef = P1 AND T2._Version <> @P2


Все равно делает поиск по кластерному индексу.
161 H A D G E H O G s
 
29.03.13
17:17
(159) 1С зарегало ошибку платформы на партнерском :-)
162 Serginio1
 
29.03.13
17:18
(160) Это понятно. Но одно дело вернуть данные потом их обработать на сервере или ничего не возвращать.
163 H A D G E H O G s
 
29.03.13
17:18
Надо попробовать 18 релиз поставить, нуавдруг.
164 Sammo
 
29.03.13
17:18
(158) Может и поломалось что-то. Как вариант - задать вопрос на партнерском - у кого есть доступ
165 H A D G E H O G s
 
29.03.13
17:18
(162) Вооот! Именно про это я говорил в (148)
166 Aprobator
 
29.03.13
17:19
может вся бодяга из за обращений клиента к серверу? Типа 1С сразу формирует и то и то, чтобы случ чего 2 раза на сервер не бегать?
167 Serginio1
 
29.03.13
17:19
(160) Так что SQL то возвращает или как оно и должно ничего не возвращает ?
168 H A D G E H O G s
 
29.03.13
17:22
(167) Оно не должно делать 2 запрос вообще.


Tormozit, будь добр, закинь в тест запрос по 1 полю:

ВерсияДанных
169 Serginio1
 
29.03.13
17:23
(165) На самом деле не все ясно, так как при подготовке кэша не нужно делать 2 х запросов, так как данных просто нет и нужно делать только один запрос. Просто в 1С могут и при этом сделать 2 запроса.
170 H A D G E H O G s
 
29.03.13
17:23
Надо ставить 18 релиз короче.
Этим я и займусь счаст.
171 Serginio1
 
29.03.13
17:24
(167) Это я прекрасно понимаю. Достаточно второго.
172 TormozIT
 
гуру
29.03.13
17:24
(168) ничего не изменилось (замер для справочника без ТЧ)

Окончание замера "Подготовка объектного кэша" - Длительность = 7.082 с, Среднее = 0.007082 с
Окончание замера "Чтение с использованием объектного кэширования до 20сек" - Длительность = 0.016 с, Среднее = 0.000016 с
Окончание замера "Чтение с использованием объектного кэширования после 20сек" - Длительность = 6.739 с, Среднее = 0.006739 с
Окончание замера "Чтение отдельными запросами" - Длительность = 2.106 с, Среднее = 0.002106 с
Окончание замера "Чтение общим запросом" - Длительность = 0.094 с, Среднее = 0.000094 с
173 TormozIT
 
гуру
29.03.13
17:26
(168) + Если я правильно понял "закинь в тест запрос по 1 полю:ВерсияДанных", то менял ИмяПоля = "ВерсияДанных".
174 H A D G E H O G s
 
29.03.13
17:26
(171) Достаточно первого запроса, и, если он вернет версию, отличную от хранимой (что очень редко!) - то - 2 запрос.
175 H A D G E H O G s
 
29.03.13
17:27
(171) И тогда у теста в(172), для "Чтение с использованием объектного кэширования до 20сек" время будет не  6.739  секунд, а 2.1 секунды.
176 H A D G E H O G s
 
29.03.13
17:28
8.2.18:

Оптимизировано получение из базы данных прикладных объектов без табличных частей при вызове метода ПолучитьОбъект() и при обращении к свойствам «через точку» от ссылки.
177 TormozIT
 
гуру
29.03.13
17:28
(174) Да. Здравый смысл так говорит. Так что либо грязный эксперимент, либо ошибка платформы.
178 Aprobator
 
29.03.13
17:29
сам кэш в исполнении 1С хранится где вообще?
179 H A D G E H O G s
 
29.03.13
17:30
(178) Ты не поверишь :-)
180 TormozIT
 
гуру
29.03.13
17:30
(178) На сервере, но в каком именно процессе я точно не знаю.
181 TormozIT
 
гуру
29.03.13
17:30
(176) Ну если она исправление такого косяка назвали оптимизацией, то явно набивают цену)
182 Aprobator
 
29.03.13
17:32
(180) хотелось бы верить. Просто, исходя из (0), ощущение такое, что он хранится на клиенте.
183 H A D G E H O G s
 
29.03.13
17:32
Вот честно - я за хранение кэша подозреваю не
rphost а rmngr, судя по активности памяти и усиленной работе с файлом snccntx.000001CF.dat
184 Нога
 
29.03.13
17:35
(183) хорош флудить, иди в будвар уже
185 H A D G E H O G s
 
29.03.13
17:35
(180) Посмотри в первые 20 секунд тем же filemon-ом от Руссиновича, что за файлы читаются.
Я заметил только rmngr за чтением snccntx.000001CF.dat
186 Aprobator
 
29.03.13
17:39
+(182) вернее даже так, смысл этого запроса в том, чтобы сервер Предприятия 1С выполнял обращение непосредственно к серверу БД только 1 раз в любом случае.
187 Serginio1
 
29.03.13
17:40
(174) А зачем первый? Если второй запрос ничего не вернул, значит запись актуальна.
188 H A D G E H O G s
 
29.03.13
17:40
(184) Ждааать. Ждаааать. © Храброе Сердце.
189 Axel2009
 
29.03.13
17:41
(176) так ты прочитал что оптимизировано, или же протестил уже?
190 H A D G E H O G s
 
29.03.13
17:41
(187) Или хотя бы так, но так - хуже.
Надо же делать связку со всеми ТЧ. И в 99% случаев - вернется пустой результат.
191 Axel2009
 
29.03.13
17:41
(181) да походу они забыли про кэш давным давно и он не работал :)
192 H A D G E H O G s
 
29.03.13
17:42
(189) Счаст качается 18
193 Serginio1
 
29.03.13
17:42
(188) Ответь на 167. Интересно ведь.
194 H A D G E H O G s
 
29.03.13
17:43
(191) Посмотри типовую УПП, как там все через точку херачется. Я конечно думал, что там "хитрый смысл" и сделано специально, полез ковырять - и появилась эта тема.
195 TormozIT
 
гуру
29.03.13
17:47
По идее для таблиц без соединений (с ТЧ) оптимальным будет такой алгоритм, если прошло 20 сек
1. Строим запрос для чтения объекта (возвращает данные объекта, если версия изменилась), т.е. только второй запрос из (0)
4. Отправляем запрос в СУБД
5. Получаем результат из СУБД
6. Если результат не пустой, то помещаем его в кэш объектов.
7. Возвращаем объект из кэша.
196 Serginio1
 
29.03.13
17:48
(190) Все раввно если запрос вернул, значит запись изменилась и нужно тянуть табличные части. Убиваем 2 х зайцев. Второй запрос к ТЧ не будет тянуть Шапку.
197 TormozIT
 
гуру
29.03.13
17:49
А вот для таблиц с соединениями надо
1. Отправляем в СУБД запрос на получение версии
2. Получаем результат и проверяем актуальность кэша.
4. Если кэш не актуален, то отправляем запрос в СУБД на получение данных объекта
5. Получаем результат из СУБД и помещаем в кэш
7. Возвращаем объект из кэша.
198 Serginio1
 
29.03.13
17:50
(195) Кстати проверь для интереса скорость в транзакции. По уму через 20 секунд повторного чтения не должно быть
199 Serginio1
 
29.03.13
17:53
(197) Вообще можно сделать ХП в который передать текущую версию а он уже вернет набор всех таблиц если версия изменена.
200 H A D G E H O G s
 
29.03.13
17:53
18 проверить не получицца. Ключик тока один и там пока под 17 работает народ, так что тока на выходных.
201 TormozIT
 
гуру
29.03.13
17:54
(198) В транзакции ожидаемо быстро

Окончание замера "Подготовка объектного кэша" - Длительность = 1.56 с, Среднее = 0.00156 с
Окончание замера "Чтение с использованием объектного кэширования до 20сек" - Длительность = 0.016 с, Среднее = 0.000016 с
Окончание замера "Чтение с использованием объектного кэширования после 20сек" - Длительность = 1.95 с, Среднее = 0.00195 с
Окончание замера "Чтение отдельными запросами" - Длительность = 2.371 с, Среднее = 0.002371 с
Окончание замера "Чтение общим запросом" - Длительность = 0.094 с, Среднее = 0.000094 с
202 H A D G E H O G s
 
29.03.13
17:54
(201) Ух ты. А что так?
203 TormozIT
 
гуру
29.03.13
17:54
(201) Упс. Не быстро. Не увидел первую строку сразу)
204 H A D G E H O G s
 
29.03.13
17:55
(203) А что не так то?
205 H A D G E H O G s
 
29.03.13
17:56
Так, я нифига не понял произошедшее, надо оттестить с НачатьТранзакцию(), так? Я правильно понял?
206 TormozIT
 
гуру
29.03.13
17:57
(204) В (203) я писал про разницу между подготовкой кэша и чтением после 20сек.
А вот разница между даже подготовкой кэша и чтения отдельными запросами на лицо.
207 H A D G E H O G s
 
29.03.13
17:57
Почему НачатьТранзакцию() дает такой результат?
208 TormozIT
 
гуру
29.03.13
17:59
Транзакционный кэш заментно быстрее заполняется и обновляется, но разницы между безусловным чтением в него и обновлением после 20сек также не видно.
209 Serginio1
 
29.03.13
17:59
(201) Интересно а почему разница то до и после 20 сек.
Значит в 8 ке уровень рид комитед а не Repeatable read ?
210 Axel2009
 
29.03.13
18:00
(208) чей кэш? скульный или 1сный?
211 TormozIT
 
гуру
29.03.13
18:00
Для рассеивания сомнений привожу код теста еще раз

Сообщить(ТекущаяДата());
ВТранзакции = Истина;
Количество = 1000;
ИмяСправочникаБезГрупп = Метаданные.Справочники.ПодпискиКоманд2iS.Имя;
ИмяПоля = "ВерсияДанных";
//ИмяПоля = "ПометкаУдаления";
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ " + XMLСтрока(Количество) + "
|    Т.Ссылка
|ИЗ
|    Справочник." + ИмяСправочникаБезГрупп + " КАК Т";
МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); //Готовим массив ссылок
Количество = МассивСсылок.Количество();
Сообщить("Размер выборки " + Количество);
Если ВТранзакции Тогда
   НачатьТранзакцию();
КонецЕсли;
УФ(сНачатьЗамер, Количество, "Подготовка объектного кэша");
Для Каждого Элемент ИЗ МассивСсылок Цикл
   Пустышка = Элемент[ИмяПоля];
КонецЦикла;
ДлительностьКэширования = УФ(сЗакончитьЗамер);
Если ДлительностьКэширования > 20 Тогда
   УФ(сСообщитьОбОшибке, "Длительность кэширования превысила 20 сек. Тест прекращен. Рекомендуется уменьшить количество элементов.");
   Перейти ~Конец;
КонецЕсли;

УФ(сНачатьЗамер, Количество, "Чтение с использованием объектного кэширования до 20сек");
Для Каждого Элемент ИЗ МассивСсылок Цикл
   Пустышка = Элемент[ИмяПоля];
КонецЦикла;
УФ(сЗакончитьЗамер);

УФ(сПодождатьЗаданноеВремя, 20);
УФ(сНачатьЗамер, Количество, "Чтение с использованием объектного кэширования после 20сек");
Для Каждого Элемент ИЗ МассивСсылок Цикл
   Пустышка = Элемент[ИмяПоля];
КонецЦикла;
УФ(сЗакончитьЗамер);

УФ(сНачатьЗамер, Количество, "Чтение отдельными запросами");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Т.Ссылка,
|    Т." + ИмяПоля + "
|ИЗ
|    Справочник." + ИмяСправочникаБезГрупп + " КАК Т
|ГДЕ
|    Т.Ссылка = &Ссылка";
Для Каждого Элемент ИЗ МассивСсылок Цикл
   Запрос.УстановитьПараметр("Ссылка", Элемент);
   Пустышка = Запрос.Выполнить().Выгрузить()[0][ИмяПоля];
КонецЦикла;
УФ(сЗакончитьЗамер);

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Т.Ссылка,
|    Т." + ИмяПоля + "
|ИЗ
|    Справочник." + ИмяСправочникаБезГрупп + " КАК Т
|ГДЕ
|    Т.Ссылка В(&МассивСсылок)";
Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
УФ(сНачатьЗамер, Количество, "Чтение общим запросом");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
   Пустышка = Выборка[ИмяПоля];
КонецЦикла;
УФ(сЗакончитьЗамер);
Если ВТранзакции Тогда
   ОтменитьТранзакцию();
КонецЕсли;
212 H A D G E H O G s
 
29.03.13
18:00
(210) Я думаю SQL_ный все же.
213 TormozIT
 
гуру
29.03.13
18:05
В документации про транзакционный кэш нашел пока это
"в рамках транзакции система использует отдельный кэш, поэтому обращение к данным объекта через ссылки в транзакциях гарантированно выдает актуальные данные"
214 Serginio1
 
29.03.13
18:05
(212) Ну кэш то на скуле имеется. При этом если транзакция Repeatable read то не смысла читать второй раз. По такому принципу должен быть и устроен транзакционный кэш 1с .
Из стать приведенной тобой
http://langslab.com/ebooks/prof-dev2/tome1/pr-dev-t1-ch04

Транзакционный кеш

Если обращение к данным происходит в рамках транзакции, то оно переадресуется транзакционному кешу. Транзакционный кеш по сути представляет собой ту же последовательную очередь, что и обычный кеш, за исключением того, что все данные, находящиеся в транзакционном кеше, являются валидными (гарантированно актуальными). При считывании данных в транзакционный кеш устанавливается блокировка на данные в базе данных, поэтому они гарантированно не могут быть изменены до окончания транзакции.
Транзакционный кеш хранит считанные данные до тех пор, пока они не будут вытеснены более поздними считанными данными или пока не закончится транзакция.
По окончании транзакции транзакционный кеш очищается, однако действия, выполняемые при этом, зависят от состояния завершения транзакции.
Если транзакция завершена успешно (Commit), данные всех объектов, содержащиеся в транзакционном кеше, переносятся в обычный кеш, а транзакционный кеш очищается (рис. 4.14).
215 H A D G E H O G s
 
29.03.13
18:09
(214) В статье ни одним духом не сказано, что это SQL-ный кэш, за что им хочется пожелать идти домой. Им - это авторам проф-разработки (статья оттуда).
216 TormozIT
 
гуру
29.03.13
18:10
Еще бы разобраться, где хранится внетранзакционный объектный кэш и где транзакционный. Пока 2 основных претендента rphost (у каждого свой кэш) и rmngr (общий для всех рабочих процессов). Логичнее всего конечно хранить в менеджере кластера rmngr и чтобы он был общий.
217 Serginio1
 
29.03.13
18:11
(215) Я говорил, что у скуля есть свой кэш. А ссылку привел на описание в статье, что скорость чтения в 1С в таком кэше не должна зависеть от времени.
218 Serginio1
 
29.03.13
18:15
(216) Ну все равно если они хранят и на сервере разницы по времени не должно быть. Если только они его не скидывают.
Тогда логичнее хранить по месту вызова.
219 TormozIT
 
гуру
15.04.13
14:33
Получил подтверждение от производителя, что
"в клиент-серверном режиме у клиента свой объектный кеш, а у сервера 1С свой".

Также он сообщил:
"Размер кеша определяется, как минимальное значение из объема доступной оперативной памяти компьютера и объема доступного виртуального адресного пространства процесса. При приближении объема занятого виртуального адресного пространства процесса 1С:Предприятия к этой величине кеш объектов начинает освобождаться форсированно. Возможности изменения правил вычисления максимального объема кеша объектов не предусмотрено."