Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Просьба помочь оптимизировать запрос

Просьба помочь оптимизировать запрос
Я
   Dev
 
17.10.18 - 14:16
Всем привет, есть запрос такого плана

"ВЫБРАТЬ
|    ЗакупкиОбороты.Контрагент
|ПОМЕСТИТЬ ВТ_Контрагенты
|ИЗ
|    РегистрНакопления.Закупки.Обороты(
|            &ДатаНачала,
|            &ДатаОкончания,
|            ,
|            Организация = &Организация
|                И Валюта = &Валюта) КАК ЗакупкиОбороты
|;
|
////////////////////////////////////////////////////////////////////////////////

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


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

  "ВЫБРАТЬ
     |    ЗакупкиОбороты.Контрагент КАК Контрагент
     |ПОМЕСТИТЬ ВТ_Контрагенты
     |ИЗ
     |    РегистрНакопления.Закупки.Обороты(
     |            &ДатаНачала,
     |            &ДатаОкончания,
     |            ,
     |            Организация = &Организация
     |                И Валюта = &Валюта) КАК ЗакупкиОбороты
     |;
     |
     ////////////////////////////////////////////////////////////////////////////////

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

     |ВЫБРАТЬ
     |    Движения.Контрагент КАК Контрагент,
     |    Движения.ОписаниеКонтрагента КАК ОписаниеКонтрагента,
     |    СУММА(Движения.Сумма) КАК Сумма,
     |    Движения.Регистратор КАК Регистратор,
     |    Движения.Содержание КАК Содержание
     |ИЗ
     |    Движения КАК Движения
     |
     |СГРУППИРОВАТЬ ПО
     |    Движения.Контрагент,
     |    Движения.ОписаниеКонтрагента,
     |    Движения.Регистратор,
     |    Движения.Содержание" ;

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


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

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

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

...

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

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

можно просто

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс, 1996 г.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует