|
Просьба помочь оптимизировать запрос | ☑ | ||
---|---|---|---|---|
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
|
А что сильно медленно работает или чисто из спортивного интереса вопрос?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |