Имя: Пароль:
1C
1С v8
Временные таблицы
,
0 Широкий
 
28.05.12
15:18
Кешируются ли они?
1 H A D G E H O G s
 
модератор
28.05.12
15:20
Закрываю ветку?
2 GROOVY
 
28.05.12
15:21
А что без голосовалки:
Да
Нет
Незнаю
КГ/АМ
3 Maxus43
 
28.05.12
15:24
Да
4 DrShad
 
28.05.12
15:24
что есть в твоем понимании "кеширование"?
5 Широкий
 
28.05.12
16:21
Я вот к чему:

Процедура Тест1()
   ВремяНачала = мЯваСкрипт.Eval("(new Date()).valueOf()");
   
   Запрос=СтруктураПараметров.Запрос;

   Для сч=1 По 1 Цикл
       Запрос.Текст="ВЫБРАТЬ РАЗРЕШЕННЫЕ
       |    ПолнаяТаблица.Единица,
       |    ПолнаяТаблица.Серия,
       |    ПолнаяТаблица.Ячейка,
       |    СкладскиеИД.Ссылка КАК СкладскойИД
       |ИЗ
       |    Документ.ПеремещениеПоЯчейкам.ПолнаяТаблица КАК ПолнаяТаблица
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СкладскиеИД КАК СкладскиеИД
       |        ПО ПолнаяТаблица.Единица = СкладскиеИД.Единица
       |            И ПолнаяТаблица.Серия = СкладскиеИД.Серия
       |            И ПолнаяТаблица.Ячейка = СкладскиеИД.МестоХранения
       |ГДЕ
       |    ПолнаяТаблица.Ссылка = &Ссылка
       |
       |ОБЪЕДИНИТЬ ВСЕ
       |
       |ВЫБРАТЬ
       |    ПолнаяТаблица.Единица,
       |    ПолнаяТаблица.Серия,
       |    ПолнаяТаблица.ЯчейкаКуда,
       |    СкладскиеИД.Ссылка
       |ИЗ
       |    Документ.ПеремещениеПоЯчейкам.ПолнаяТаблица КАК ПолнаяТаблица
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СкладскиеИД КАК СкладскиеИД
       |        ПО ПолнаяТаблица.Единица = СкладскиеИД.Единица
       |            И ПолнаяТаблица.Серия = СкладскиеИД.Серия
       |            И ПолнаяТаблица.ЯчейкаКуда = СкладскиеИД.МестоХранения
       |ГДЕ
       |    ПолнаяТаблица.Ссылка = &Ссылка
       |    И ПолнаяТаблица.ЯчейкаКуда <> ЗНАЧЕНИЕ(Справочник.МестаХранения.ПустаяСсылка)";
       
       Запрос.Выполнить();
   КонецЦикла;
   
   ВремяКонцаВыполнения = мЯваСкрипт.Eval("(new Date()).valueOf()");
   
   ФорматСтрока = Формат((ВремяКонцаВыполнения - ВремяНачала) / 1000, "ЧДЦ=3; ЧРД=.; ЧН=0; ЧГ=");
   Сообщить("Тест по ссылке "+ФорматСтрока,СтатусСообщения.БезСтатуса);
КонецПроцедуры

Процедура Тест2()
   ВремяНачала = мЯваСкрипт.Eval("(new Date()).valueOf()");
   
   Запрос=СтруктураПараметров.Запрос;
   
   Для сч=1 По 1  Цикл
       Запрос.Текст="ВЫБРАТЬ РАЗРЕШЕННЫЕ
       |    ПолнаяТаблица.Единица,
       |    ПолнаяТаблица.Серия,
       |    ПолнаяТаблица.Ячейка,
       |    СкладскиеИД.Ссылка КАК СкладскойИД
       |ИЗ
       |    ПолнаяТаблица КАК ПолнаяТаблица
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СкладскиеИД КАК СкладскиеИД
       |        ПО ПолнаяТаблица.Единица = СкладскиеИД.Единица
       |            И ПолнаяТаблица.Серия = СкладскиеИД.Серия
       |            И ПолнаяТаблица.Ячейка = СкладскиеИД.МестоХранения
       |
       |ОБЪЕДИНИТЬ ВСЕ
       |
       |ВЫБРАТЬ
       |    ПолнаяТаблица.Единица,
       |    ПолнаяТаблица.Серия,
       |    ПолнаяТаблица.ЯчейкаКуда,
       |    СкладскиеИД.Ссылка
       |ИЗ
       |    ПолнаяТаблица КАК ПолнаяТаблица
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СкладскиеИД КАК СкладскиеИД
       |        ПО ПолнаяТаблица.Единица = СкладскиеИД.Единица
       |            И ПолнаяТаблица.Серия = СкладскиеИД.Серия
       |            И ПолнаяТаблица.ЯчейкаКуда = СкладскиеИД.МестоХранения
       |ГДЕ
       |    ПолнаяТаблица.ЯчейкаКуда <> ЗНАЧЕНИЕ(Справочник.МестаХранения.ПустаяСсылка)";
       
       Запрос.Выполнить();
   КонецЦикла;
   
   ВремяКонцаВыполнения = мЯваСкрипт.Eval("(new Date()).valueOf()");
   
   ФорматСтрока = Формат((ВремяКонцаВыполнения - ВремяНачала) / 1000, "ЧДЦ=3; ЧРД=.; ЧН=0; ЧГ=");
   Сообщить("Тест временная таблица "+ФорматСтрока,СтатусСообщения.БезСтатуса);
КонецПроцедуры
6 Широкий
 
28.05.12
16:21
Тест по ссылке 0.012
Тест временная таблица 0.036
Тест по ссылке 0.012
Тест временная таблица 0.035
Тест по ссылке 0.012
Тест временная таблица 0.036
Тест по ссылке 0.013
Тест временная таблица 0.036
Тест по ссылке 0.013
Тест временная таблица 0.037
Тест по ссылке 0.013
Тест временная таблица 0.037
Тест по ссылке 0.015
Тест временная таблица 0.038
Тест по ссылке 0.012
Тест временная таблица 0.038
Тест по ссылке 0.012
Тест временная таблица 0.037
Тест по ссылке 0.013
Тест временная таблица 0.035
Тест по ссылке 0.013
Тест временная таблица 0.036
Тест по ссылке 0.013
Тест временная таблица 0.041
7 Широкий
 
28.05.12
16:44
Забавно .. в цикле по 10 штук результаты такие:
Тест по ссылке 0.113
Тест временная таблица 0.132
Тест по ссылке 0.116
Тест временная таблица 0.144
Тест по ссылке 0.115
Тест временная таблица 0.131
Тест по ссылке 0.110
Тест временная таблица 0.133
Тест по ссылке 0.117
Тест временная таблица 0.129
Тест по ссылке 0.110
Тест временная таблица 0.133
Тест по ссылке 0.114
Тест временная таблица 0.130
Тест по ссылке 0.116
Тест временная таблица 0.140

Ощущение, будто кеш отрабатывает только на время вызова процедуры
8 Широкий
 
28.05.12
16:50
Трололо хватило только на первый пост?
9 aristar
 
28.05.12
16:52
Вы лучше словами опишите вопрос, а то приходится гадать что вас удивляет
10 DrShad
 
28.05.12
16:53
(8) а где у тебя вообще временные таблицы?
11 Fragster
 
гуру
28.05.12
16:53
tempdb на медленном диске?*
12 Широкий
 
28.05.12
16:55
(11) Нет. Сервак полноценный со всеми вытекающими
13 Широкий
 
28.05.12
16:57
Вот вызов, если не понятно

Процедура КнопкаВыполнитьНажатие(Кнопка)
   Ссылка=Документы.ПеремещениеПоЯчейкам.НайтиПоНомеру(2,ТекущаяДата());
   
   МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
   
   Запрос=Новый Запрос;
   Запрос.МенеджерВременныхТаблиц=МенеджерВременныхТаблиц;
   Запрос.УстановитьПараметр("Ссылка",Ссылка);
   
   Запрос.Текст="ВЫБРАТЬ
   |    ПолнаяТаблица.Номенклатура,
   |    ПолнаяТаблица.Единица,
   |    ПолнаяТаблица.Серия,
   |    ПолнаяТаблица.Количество,
   |    ПолнаяТаблица.Ячейка,
   |    ПолнаяТаблица.ЯчейкаКуда
   |ПОМЕСТИТЬ ПолнаяТаблица
   |ИЗ
   |    Документ.ПеремещениеПоЯчейкам.ПолнаяТаблица КАК ПолнаяТаблица
   |ГДЕ
   |    ПолнаяТаблица.Ссылка = &Ссылка";
   
   Запрос.Выполнить();            
   
   СтруктураПараметров=Новый Структура;
   СтруктураПараметров.Вставить("Запрос",Запрос);
   СтруктураПараметров.Вставить("МенеджерВременныхТаблиц",МенеджерВременныхТаблиц);

   КоличествоЦиклов=2;
   
   Тест1();    
   
   Тест2();
КонецПроцедуры
14 Fragster
 
гуру
28.05.12
16:58
(12) это не ответ на вопрос, лежит ли tempdb на медленном диске
15 DrShad
 
28.05.12
16:59
(13) и как замеры в тестах относятся к ВТ?
16 Широкий
 
28.05.12
16:59
(14) Рабочая база лежит на быстрых дисках, моя копия на медленном.
Результат одинаковый
17 GROOVY
 
28.05.12
17:03
Соберу вопросы к автору ветки, а то не продуктивно получается...

1. что есть в твоем понимании "кеширование"?
2. и как замеры в тестах относятся к ВТ?
3. лежит ли tempdb на медленном диске?
От себя добавлю:
4. Зачем в этом примере использовать ВТ?
5. Проиндексировать поля ВТ пробовал?
18 DrShad
 
28.05.12
17:06
(17) Паш, ты теперь тут как третийский судья
19 H A D G E H O G s
 
28.05.12
17:06
(17) Прежде чем задать вопрос 5 - надо спросить - ТЧ ПолнаяТаблица документа ПеремещениеПоЯчейкам за номером 2 содержит более 600 строк, или нет.
20 H A D G E H O G s
 
28.05.12
17:08
(4). Использовать ВТ тут имеет смысл в том случае, если тут дофига этих документов. Если их много - это принесет добро, иначе - зло. Но в любом случае ВТ увеличит масштабируемость.
21 H A D G E H O G s
 
28.05.12
17:09
(20) -> (17)
22 H A D G E H O G s
 
28.05.12
17:10
(17) Он закэшировал отбор ТЧ по документу во временную таблицу
23 Широкий
 
28.05.12
17:11
(17) ептель..

1. Это буфер из которого можно довольно таки быстро получить информацию
2. И в ВТ и в выборке по ссылке одинаковые данные. Логично ожидать одинаковую скорость получения данных
3. Нет, диски серверный - довольно быстрые
4. Это кусок из проведения документа. ВТ нужна - т.к. документ на момент вызова запроса не записан.
5. Не пробовал, там всего 15 строк. Сейчас попробовал - результат тот же
24 GROOVY
 
28.05.12
17:11
19 - 22 Я как бэ в курсе...
25 H A D G E H O G s
 
28.05.12
17:11
(17) Хотя, возможно, это сделает сам SQL, без всяких ВТ. Не знаю.
26 Широкий
 
28.05.12
17:13
(23) Поправка по 5 пункту. Строк в документе 14
27 GROOVY
 
28.05.12
17:13
(23) Временная таблица - это таблица которая _реально_ создается в базе. Это просто таблица. При обращении к ней система тратит столько же ресурсов как и при обращении с любой другой таблице. Но в случае с ВТ еще тратится время на ее создание и уничтожение.
28 DrShad
 
28.05.12
17:14
(27) ну и где здесь кеширование?
29 Широкий
 
28.05.12
17:15
(27) Да ну блин.. ты серьезно?
Если посмотришь код - время замеряется у меня чисто по выборке из ВТ и до окончания процедуры
30 GROOVY
 
28.05.12
17:15
(28) Понятия не имею... Кэширование в понимании ТС и временные таблицы не имеют ничего общего.
31 H A D G E H O G s
 
28.05.12
17:16
(30) Посмотри его тексты кода и (22)
32 DrShad
 
28.05.12
17:17
(30) вот и я о чем
33 H A D G E H O G s
 
28.05.12
17:17
p.s. Гуру оптимизаций, сколько раз SQL сервер выполнит поиск?

ВЫБРАТЬ
   ПеремещениеТоваровТовары.Номенклатура,
   ПеремещениеТоваровТовары.Количество
ИЗ
   Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
ГДЕ
   ПеремещениеТоваровТовары.Ссылка = &Ссылка

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ПеремещениеТоваровТовары.Номенклатура,
   ПеремещениеТоваровТовары.Количество
ИЗ
   Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
ГДЕ
   ПеремещениеТоваровТовары.Ссылка = &Ссылка
34 GROOVY
 
28.05.12
17:20
(29) И что?
35 ILM
 
гуру
28.05.12
17:28
(33)
Адын
36 H A D G E H O G s
 
28.05.12
17:29
У кого еще будут мнения?
37 ssh2006
 
28.05.12
17:34
я бы при написании такого запроса исходил из того, что будет два раза выполнен
38 Fragster
 
гуру
28.05.12
17:34
(36) замени ОБЪЕДИНИТЬ ВСЕ на ОБЪЕДИНИТЬ
39 H A D G E H O G s
 
28.05.12
17:36
(38) Зачем?
40 Fragster
 
гуру
28.05.12
17:39
(39) просто так
41 H A D G E H O G s
 
28.05.12
17:41
Почти уверен, что план запроса покажет мне 2 indexseek(tablescan) по табличной части. Проверить?
42 Fragster
 
гуру
28.05.12
17:41
(41) давай
43 H A D G E H O G s
 
28.05.12
17:42
(42) Ты чего, караулишь штоле?
44 H A D G E H O G s
 
28.05.12
17:42
(42) Тоесть, я не прав?
45 acsent
 
28.05.12
17:43
(44) ты знаешь как работает оптимизатор мсскл?
46 H A D G E H O G s
 
28.05.12
17:44
(45) Нет.
47 H A D G E H O G s
 
28.05.12
17:45
Но к сожалению, я пока услышал только 1 конкретный ответ.
48 acsent
 
28.05.12
17:46
конкретного ответа пока не дал никто, только догадки
49 Fragster
 
гуру
28.05.12
17:48
(43) ??
(44) да не, мне самому интересно, но сейчас до скуля далеко
50 H A D G E H O G s
 
28.05.12
17:48
В (35) конкретный ответ, вопрос в том - правильный или нет.
51 Rebelx
 
28.05.12
17:59
(33) Два. Адназначна
52 H A D G E H O G s
 
28.05.12
17:59
2 clustered index seek по плану запроса.
Только вот физически он 2 раза ищет, или 1???
53 H A D G E H O G s
 
28.05.12
18:02
2 варианта -
а) читать книги
б) нагрузить сервак и выполнить объединение - запрос не 2 раза, а дофигища раз и посмотреть времена выполнения каждого поиска. Если одинаковые - значит искал 1 раз и тупо время выполнения разделил на число раз.
54 Rebelx
 
28.05.12
18:05
(52) тут сложнее. эти два поиска выполнятся практически за то же время, что и один - данные будут закэшированы, статистика обновлена. но поиск выполнится два раза.
для точного ответа необходимо читать фактический план запроса - т.е. то, что в текстовом виде после выполнения запроса, а не то что до выполнения и в красивых картинках :)
55 Широкий
 
29.05.12
09:00
Че то вас не туда понесло

(33) Два поиска по индексу будет.
Кешируется ИМХО полный запрос, а не его части.
56 hhhh
 
29.05.12
09:19
ну а что там в test() ?
57 Широкий
 
29.05.12
09:30
(56) Не понял
58 Широкий
 
29.05.12
09:57
Очень интересная вещь.
В скуле воспроизвел эти два запроса - время выполнения идентично (смотрел по профайлеру). План запроса тоже совпадает.
Когда идет выполнение из 1с - время отличается в разы.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс