Имя: Пароль:
1C
1С v8
Просьба помочь оптимизировать запрос
,
0 Dev
 
17.10.18
14:16
Всем привет, есть запрос такого плана

"ВЫБРАТЬ
|    ЗакупкиОбороты.Контрагент
|ПОМЕСТИТЬ ВТ_Контрагенты
|ИЗ
|    РегистрНакопления.Закупки.Обороты(
|            &ДатаНачала,
|            &ДатаОкончания,
|            ,
|            Организация = &Организация
|                И Валюта = &Валюта) КАК ЗакупкиОбороты
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ВЫБОР
|        КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа)
|            ТОГДА УправленческийДвиженияССубконто.СубконтоДт1
|        ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1
|    КОНЕЦ КАК Контрагент,
|    ВЫБОР
|        КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа)
|            ТОГДА УправленческийДвиженияССубконто.СубконтоДт1.Описание
|        ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1.Описание
|    КОНЕЦ КАК ОписаниеКонтрагента,
|    УправленческийДвиженияССубконто.Сумма,
|    УправленческийДвиженияССубконто.Регистратор,
|    УправленческийДвиженияССубконто.Содержание
|ИЗ
|    РегистрБухгалтерии.Управленческий.ДвиженияССубконто(
|            &ДатаНачала,
|            &ДатаОкончания,
|            Организация = &Организация
|                И ((СчетДт В ИЕРАРХИИ (&СчетГруппа)
|                        И СубконтоДт1 В
|                            (ВЫБРАТЬ
|                                ВТ_Контрагенты.Контрагент
|                            ИЗ
|                                ВТ_Контрагенты))
|                    ИЛИ (СчетКт В ИЕРАРХИИ (&СчетГруппа)
|                        И СубконтоКт1 В
|                            (ВЫБРАТЬ
|                                ВТ_Контрагенты.Контрагент
|                            ИЗ
|                                ВТ_Контрагенты))),
|            ,
|            ) КАК УправленческийДвиженияССубконто";
        
//########################################################################################################

А вот этот вариант я смог пока что придумать по его оптимизации

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

//#################################################################################

Может кто-нибудь подскажет еще варианты или скажет что не так в моей оптимизации
1 elCust
 
17.10.18
14:19
А что не так по твоему?
2 Dev
 
17.10.18
14:21
Да по моему все так, но я все же думаю лучше спросить
3 Ник080808
 
17.10.18
14:27
(2) а зачем группировка по содержанию и описанию?
4 Dev
 
17.10.18
14:28
(1) Единственное что мне не нравится это В ИЕРАРХИИ
5 Dev
 
17.10.18
14:29
(3) А что с этими полями делать ? Не суммировать же
6 Buster007
 
17.10.18
14:30
УправленческийДвиженияССубконто.СубконтоДт1.Описание
вот это крутая штука
7 Dev
 
17.10.18
14:30
Этим запросом я просто избавился от ИЛИ
8 d4rkmesa
 
17.10.18
14:30
(0) ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ группирует одинаковые строки. Так задумано?
9 VS-1976
 
17.10.18
14:31
(2) Думаю что лучше может быть так:

ПОМЕСТИТЬ ВТ_Контрагенты
...

ИНДЕКСИРОВАТЬ ПО
  ЗакупкиОбороты.Контрагент
;

...

РегистрБухгалтерии.Управленческий.ДвиженияССубконто(
  &ДатаНачала,
  &ДатаОкончания,
  Организация = &Организация
  И СчетКт В ИЕРАРХИИ (&СчетГруппа)
КАК тзДвижения

СОЕДИНЕНИЕ ВТ_Контрагенты
  ПО ВТ_Контрагенты.Контрагент = тзДвижения.СубконтоКт1
10 VS-1976
 
17.10.18
14:32
(4) А чего там тебе не нравится то? :)
11 Buster007
 
17.10.18
14:32
(0) куда устраиваешься работать? рассказывай, не скрывай...
Что-то подобное я уже здесь видел )
12 Dev
 
17.10.18
14:34
(8) Ты перепутал наоборот
13 Dev
 
17.10.18
14:34
(11) И что ты знаешь как правильно чтоли ))
14 Dev
 
17.10.18
14:37
Точнее как лучше
15 VS-1976
 
17.10.18
14:37
(11) Это HR собирает души :)
16 Dev
 
17.10.18
14:38
(9) Индексировать контрагентов, ну это да думаю можно
17 VS-1976
 
17.10.18
14:39
(16) Там проблема может возникнуть если контрагентов много. В моём случае лучше будет отрабатывать. А если контрагентом мало то не шибко замедлит...
18 RomanYS
 
17.10.18
14:40
Движения с субконто - ужасная с точки зрения скорости таблица. Есть вероятность, что соединение таблицы оборотов (периодичность - запись) с живой таблицей РБ (чтобы получить содержание проводки) может быть быстрее. При правильном указании параметров таблицы оборотов конечно (параметр Субконто обязателен)
19 Dev
 
17.10.18
14:42
(17) Ну да, лучше надеется на худшее
20 RomanYS
 
17.10.18
14:44
Кстати вместо
(СчетДт В ИЕРАРХИИ (&СчетГруппа)
|                        И СубконтоДт1 В
|                            (ВЫБРАТЬ
|                                ВТ_Контрагенты.Контрагент
|                            ИЗ
|                                ВТ_Контрагенты))
|                    ИЛИ (СчетКт В ИЕРАРХИИ (&СчетГруппа)
|                        И СубконтоКт1 В
|                            (ВЫБРАТЬ
|                                ВТ_Контрагенты.Контрагент
|                            ИЗ
|                                ВТ_Контрагенты))

можно просто

(Счет В ИЕРАРХИИ (&СчетГруппа)
|                        И Субконто1 В
|                            (ВЫБРАТЬ
|                                ВТ_Контрагенты.Контрагент
|                            ИЗ
|                                ВТ_Контрагенты))
21 VS-1976
 
17.10.18
14:45
(18) В данном запросе лучше виртуальная, так как в начале возьмёт движения за период в основной таблице и вытащит по регистратору субконто, а потом фильтранёт. Если делать из физических таблиц можно ускорить только если 2 запроса как-то объединить в один. Если период будет небольшим то не стоит так изощряться...
22 VS-1976
 
17.10.18
14:45
(20) И Субконто1 - это не прокатит :)
23 Buster007
 
17.10.18
14:46
если я правильно, то там можно наложить отбор на вид субконто )
24 VS-1976
 
17.10.18
14:47
(23) Если про физическую таблицу субконто то да это единственное её ускорение, если не по регистратору брать
25 VS-1976
 
17.10.18
14:49
(23) А ты про виртуальную... Теоретически можно, только какой запрос будет...
26 Buster007
 
17.10.18
14:49
(25) лучше, чем субконтоКт1 в (контрагенты)
27 Dev
 
17.10.18
14:50
(20) Это конечно замечательно ты написал но там нет таких полей
28 elCust
 
17.10.18
14:50
(20) За отсутствие ВЫРАЗИТЬ(Субконто1 КАК ...) сразу надо по рукам дать.
29 d4rkmesa
 
17.10.18
14:53
(12) Посмотрел еще раз, таки нет:
"В общем случае, при объединении в запросе результатов нескольких запросов следует использовать конструкцию ОБЪЕДИНИТЬ ВСЕ, а не ОБЪЕДИНИТЬ. Поскольку во втором варианте, при объединении запросов полностью одинаковые строки заменяются одной, на что затрачивается дополнительное время, даже в случаях, когда одинаковых строк в запросах заведомо быть не может."
https://its.1c.ru/db/v8std#content:-2145783213:hdoc
30 RomanYS
 
17.10.18
14:55
(22) что именно не прокатит? Таблица ДвиженияССубконто позволяет накладывать фильтр в параметрах на Субконто, СубконтоДт, СубконтоКт и КорСубконто
31 Dev
 
17.10.18
14:55
(29) То есть вначале ОБЪЕДИНИТЬ ВСЕ а потом группировать чтоли
32 VS-1976
 
17.10.18
14:55
(29) А ты и не знал чем отличаются команды UNION и UNION ALL :). UNION ALL это тупо дописка в конец 1-й таблицы, а UNION это + DISTINCT ( РАЗЛИЧНЫЕ ), и скорее всего через хэш ключ идёт объединение...
33 Dev
 
17.10.18
14:58
(29) Интересно, зачем тогда придумали ОБЪЕДИНИТЬ если это не оптимально
34 VS-1976
 
17.10.18
14:58
(30) Посмотрел есть... Сжечь ведьму!..
35 d4rkmesa
 
17.10.18
14:58
(32) Ну я то знал, без подробностей. ) Но мало ли что, и на старуху бывает...
36 VS-1976
 
17.10.18
14:59
(33) Ну как же, часто нужна, к примеру при объединении контрагентов из разных таблиц, чтобы составить уникальный список
37 Buster007
 
17.10.18
14:59
(34) - а можно сначала гм...? Уж очень красивая.
- мм.. Можно.. но потом сжечь.
38 d4rkmesa
 
17.10.18
15:00
(33) Есть задачи, к примеру, из тч списка документов получить список уникальной номенклатуры.
39 cons24
 
17.10.18
15:03
Еще можно глянуть индексы таблицы. В Параметрах виртуальной таблицы сейчас Организация, Счет, Субконто. Проверить, попадает ли условие в индекс, если нет (например, есть только Организация+Счет) - попробовать вынести Субконто в ГДЕ.

Как писали выше - добавить Выразить() на субконто.
40 VS-1976
 
17.10.18
15:09
(39) Как бы смешно не было но Выразить() на субконто думаю абсолютно бесполезная хр#нь, единственно куда выразить нужно пристроить, так это к УправленческийДвиженияССубконто.СубконтоДт1.Описание
41 Dev
 
17.10.18
15:11
(9) А во втором пункте я не совсем понял как там соединить контрагентов и поместить во временную таблицу, не совсем понятно, можно поподробнее расписать.
42 Dev
 
17.10.18
15:12
Или может просто контрагентов проиндексировать и оставить уже так как есть
43 Dev
 
17.10.18
15:14
Ну конечно я скорость замерял на пустых таблицах и так не понятно что быстрее отрабатывает, какой запрос, там то так то так
44 Dev
 
17.10.18
15:15
(42) Как есть это в смысле мой второй вариант
45 VS-1976
 
17.10.18
15:29
(44) "ВЫБРАТЬ
     |    ЗакупкиОбороты.Контрагент КАК Контрагент
     |ПОМЕСТИТЬ ВТ_Контрагенты
     |ИЗ
     |    РегистрНакопления.Закупки.Обороты(
     |            &ДатаНачала,
     |            &ДатаОкончания,
     |            ,
     |            Организация = &Организация
     |                И Валюта = &Валюта) КАК ЗакупкиОбороты

     |ИНДЕКСИПРОВАТЬ ПО
     |  ЗакупкиОбороты.Контрагент

     |;
46 Dev
 
17.10.18
15:32
(45) Да это я понял, дальше там еще у тебя написано
47 VS-1976
 
17.10.18
15:34
(46) Ну там просто вместо того что бы субконто в виртуальной фильтровать, фильтруется соединением, так как контрагент в индексе, по идее соединение будет быстрее работать чем конструкция В ( IN )
48 VS-1976
 
17.10.18
15:36
(47) Разумеется на большом списке. Так как фильтрация в виртуальной таблице всё равно идёт после соединения с субконто, по этому на большом списке контрагентов будет работать быстрее...
49 tesseract
 
17.10.18
15:42
Все хреново - регистр "ДвиженияССубконто" Самый тормозной изо всех. Еще и "счет в иерархии" используется в каждом подзапросе.  Не используется отбор по виду субконто.
50 tesseract
 
17.10.18
15:43
(47) С каких пор Join стал быстрым и нормально использовать  индекс?
51 Dev
 
17.10.18
15:46
(47) Ну эту часть я и хотел бы в коде увсидеть
52 Dev
 
17.10.18
15:47
Увидеть
53 VS-1976
 
17.10.18
16:06
(50) Ты просто не знаешь что такое IN на списке в примеру в 1000
54 Пузан
 
17.10.18
16:30
А что сильно медленно работает или чисто из спортивного интереса вопрос?
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс