Имя: Пароль:
1C
1С v8
Скорость выполнения запроса
0 geka-geka
 
29.03.12
08:51
Почему на серверном варианте скорость выполнения запроса с предопределенного 10 счета в разы быстрее, чем с 20.03 созданного в режиме предприятия. При прочих равных. В файловом варианте скорость та же.

Функция ПолучитьКолОстатокПоСчету(Период, Субконто1 = Неопределено, Субконто2 = Неопределено)
   
   Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("Период"      , Период);
   Запрос.УстановитьПараметр("Счет1"       , СчетСписания);
   Запрос.УстановитьПараметр("Организация" , Организация);
   Запрос.УстановитьПараметр("Субконто1"   , Субконто1);
   Запрос.УстановитьПараметр("Субконто2"   , Субконто2);
   
   ////////// разобраться c видами субконто /////////
   Запрос.УстановитьПараметр("ВидыСубконто", ПланыСчетов.Хозрасчетный.Материалы.ВидыСубконто.ВыгрузитьКолонку("ВидСубконто"));
   
   Запрос.УстановитьПараметр("Ссылка"   , БухСправка.Ссылка);
   
   Запрос.Текст = "ВЫБРАТЬ
                  |    Остатки.Счет,
                  |    Остатки.Субконто1,
                  |    Остатки.Субконто2,
                  |    СУММА(ЕСТЬNULL(Остатки.СуммаОстаток, 0)) КАК СуммаОстаток,
                  |    СУММА(ЕСТЬNULL(Остатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
                  |ИЗ
                  |    РегистрБухгалтерии.Хозрасчетный.Остатки(
                  |            &Период,
                  |            Счет В ИЕРАРХИИ (&Счет1),
                  |            &ВидыСубконто,
                  |            Организация = &Организация
                  |                И Субконто1 = &Субконто1
                  |                И Субконто2 = &Субконто2) КАК Остатки
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    Остатки.Счет,
                  |    Остатки.Субконто1,
                  |    Остатки.Субконто2";

   Остатки = Запрос.Выполнить().Выгрузить();    
   Возврат Остатки;
   
КонецФункции // ПолучитьОстатокПоСчету()
1 geka-geka
 
29.03.12
09:04
есть мысли?
2 ДенисЧ
 
29.03.12
09:10
Берём скуль... Ловим им запрос... Смотрим в план... Думаем...
3 geka-geka
 
29.03.12
09:11
а на пальцах?
4 el-gamberro
 
29.03.12
09:12
(3) Приведи время выполнения первого и второго запроса желательно с точностью до микросекунд. тогда можно что-то оперделенное грить
5 pessok
 
29.03.12
09:15
фрагментация таблицы по двадцатке в скуле болье, чем по десятке
6 geka-geka
 
29.03.12
09:18
(5) то есть не зависит от того в конфигураторе создали счет или в предприятии?
7 el-gamberro
 
29.03.12
09:20
(6) почему бы тебе не сравнить между собой еще счета созданные в конф и в предприятии
8 el-gamberro
 
29.03.12
09:21
2 счета слишком маленкая выборка чтобы что-то грить. а вообще прав (2). без плана запроса нельзя точ но сказать почему такая скорость работы запроса
9 pessok
 
29.03.12
09:27
(6) вот от этого наверняка не зависит, но надо таки сделать как а (6) и в (2)
10 geka-geka
 
29.03.12
09:41
по поводу (4) время запроса с 20.03 - 0,628179; с 10 0,083379
11 Maxus43
 
29.03.12
09:47
ещё быстрей будет работать без В ИЕРАРХИИ, например все субсчета загнать в массив и в запросе В(&сЧЕТА)
12 geka-geka
 
29.03.12
10:02
проверил, не зависит от того где создан счет в конфигураторе или в предприятии.
13 ДенисЧ
 
29.03.12
10:03
(12) ну вот :-)
14 geka-geka
 
29.03.12
10:04
по поводу (2) нет ни знаний, ни возможности
15 geka-geka
 
29.03.12
10:17
как ни странно (11) помогло снизить скорость с 0,628 до 0,073. Спасибо  Maxus43
16 jsmith82
 
29.03.12
10:19
(15) ну так в типовых не видел что-ли постоянно в массив суют
17 ZanderZ
 
29.03.12
10:19
(15) ничего странного если посмотреть план запроса
18 geka-geka
 
29.03.12
10:21
(16) видел, но не знал что это может повлиять
19 jsmith82
 
29.03.12
10:21
самое главное, чтобы по плану путина
20 Maxus43
 
29.03.12
10:22
(15) :) В ИЕРАРХИИ - ЗЛО
21 jsmith82
 
29.03.12
10:23
конечно, зло, потомков у родителя может быть тысяча, а в массиве элементов раз два и обсчёлся
22 unregistered
 
29.03.12
10:24
Как вариант:

Параметр ВидСубконто в запросе помимо отбора выполняет еще и функцию сортировки субконто на счете для получения данных.

Таким образом, если на счете определены субконто
Субконто1 - номенклатура
Субконто2 - склады
а мы передали в параметр массив, где первый элемент - Склады, а второй - Номенклатура (порядок не такой как на самом счете), то система затратит еще кучу времени на то, чтобы получить таблицу с указанным нами порядком следования субконто.
23 geka-geka
 
29.03.12
10:26
Еще странно, что в файловом варианте работает одинаково быстро
24 Maxus43
 
29.03.12
10:27
(23) СУБД 1с оптимизирована под В ИЕРАРХИИ значит, а тут СКУЛЬ, у него своё мнение о планах запроса и их оптимизации
25 unregistered
 
29.03.12
10:27
Еще вариант:

Физические таблицы итогов для счетов с разным количеством субконто разные.
Если у нас один счет имеет два субконто, а другой счет - три субконто, то данные для виртуальных таблиц будут браться из разных физических таблиц. А эти физические таблицы могут заметно различаться по своим размерам. Соответственно и скорость выполнения запроса будет разной.