|
оптимизировать время выполнения запроса - как? | ☑ | ||
---|---|---|---|---|
0
altaykniga
26.10.18
✎
16:37
|
добрый вечер, уважаемые специалисты. Прошу подсказать, как оптимизировать время выполнения запроса.
в запросе получаю контрагентов с дебиторской задолженностью на определенную дату. Вот поля запроса: |запр0.Контрагент КАК Контрагент, |запр0.СуммаРазвернутыйОстатокДт КАК СуммаРазвернутыйОстатокДт, |запр0.Договор КАК Договор Нужно сюда еще прикрутить дату последней операции. т.е. через левоеСоединение обратиться к РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт. написал тект запроса для одного контрагента и договора (передаются параметрами в запрос). А как приведенный ниже запрос прикрутить к запросу выше - непонятно мне "ВЫБРАТЬ ПЕРВЫЕ 1 | ХозрасчетныйОборотыДтКт.Период КАК Период |ИЗ | РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт( | &ДатаНачала, | &ДатаОстатков, | Регистратор, | , | , | , | , | Организация = &Организация | И ((СубконтоДт1 = &Контрагент | И СубконтоДт2 = &Договор) | ИЛИ (СубконтоКт1 = &Контрагент | И СубконтоКт2 = &Договор))) КАК ХозрасчетныйОборотыДтКт |ГДЕ | (ХозрасчетныйОборотыДтКт.СчетДт В ИЕРАРХИИ (&СписокСчетов) | ИЛИ ХозрасчетныйОборотыДтКт.СчетКт В ИЕРАРХИИ (&СписокСчетов)) | |УПОРЯДОЧИТЬ ПО | Период УБЫВ"; Заранее благодарю за помощь! |
|||
1
altaykniga
29.10.18
✎
13:28
|
поднимаю.
если мой запрос написан некорректно, прошу подсказать, как составить текст запроса для получения даты последнего движения по регистру бухгалтерии с отбором: контрагент, договор, списокСчетов. |
|||
2
catena
29.10.18
✎
13:31
|
(1)Левое соединение, максимум(период)
|
|||
3
RomanYS
29.10.18
✎
13:32
|
(0)
1. зачем ОборотыДтКт, есть просто Обороты 2. обязательно(для норм. производительности) указание параметра ВТ вид субконто |
|||
4
RomanYS
29.10.18
✎
13:33
|
*(3)
после выполнения п.1 условие на счет уйдет в параметры ВТ |
|||
5
VS-1976
29.10.18
✎
13:42
|
(3) Зачем обороты, когда есть физическая таблица РегистрБухгалтерии.Управленческий.Субконто? Всё равно брать лишь дату...
|
|||
6
VS-1976
29.10.18
✎
14:01
|
(0) В общем пожалел тебя малость. Лови запрос
ВЫБРАТЬ запр0.Контрагент КАК Контрагент, запр0.СуммаРазвернутыйОстатокДт КАК СуммаРазвернутыйОстатокДт, запр0.Договор КАК Договор, тзПоследнееДвижениеПоДоговору.Период КАК ПоследнееДвижение ИЗ ... ЛЕВОЕ СОЕДИНЕНИЕ ( ВЫБРАТЬ МАКСИМУМ( тзСубконто.Период ) ИЗ РегистрБухгалтерии.Управленческий.Субконто КАК тзСубконто СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий КАК рбОбороты ПО рбОбороты.Регистратор = тзСубконто.Регистратор И рбОбороты.Организация = &Организация И ( рбОбороты.СчетДт В ИЕРАРХИИ ( &СписокСчетов ) Или рбОбороты.СчетКт В ИЕРАРХИИ ( &СписокСчетов ) ) ГДЕ тзСубконто.Период МЕЖДУ &ДатаНачала И &ДатаОстатков И тзСубконто.Вид = ЗНАЧЕНИЕ( ПланВидовХарактеристик.ВидыСубконтоУправленческие.Договоры ) И тзСубконто.Значение = &Договор ) КАК тзПоследнееДвижениеПоДоговору ПО Истина |
|||
7
VS-1976
29.10.18
✎
14:03
|
(6) Там немного не додумал...
ЕСТЬNULL( тзПоследнееДвижениеПоДоговору.Период, ДАТАВРЕМЯ( 1,1,1 ) ) КАК ПоследнееДвижение |
|||
8
RomanYS
29.10.18
✎
14:15
|
(5) там нет счетов, придется соединять ещё физ. таблицей РБ. Не факт, что будет лучше ВТ с правильно заданными параметрами
|
|||
9
altaykniga
29.10.18
✎
14:29
|
(8) в (6) есть отбор в таблице рбОбороты
|
|||
10
altaykniga
29.10.18
✎
14:29
|
(6) при формировании запроса выходит ошибка:
"Неверные параметры в операции сравнения. Нельзя сравнивать поля неограниченной длины и поля несовместимых типов. тзСубконто.Период <<?>>МЕЖДУ &ДатаНачала И &ДатаОстатков" |
|||
11
VS-1976
29.10.18
✎
14:31
|
(10) Ну а что ты а эти параметры пихаешь то? Там должны быть 2 даты. 1-я начала просмотра оборотов и 2-я дата формирования остатка. Эти даты не должны быть пустыми
|
|||
12
altaykniga
29.10.18
✎
14:36
|
(11) в этих параметрах у меня 2 границы
|
|||
13
VS-1976
29.10.18
✎
14:37
|
(8) Будет в любом случае лучше. Так как в ВТ в начале идёт соединение, а потом фильтрация. А у меня фильтрация и уменьшенное соединение, а потом небольшая фильтрация
|
|||
14
altaykniga
29.10.18
✎
14:37
|
ГраницаНачала = Новый Граница(НачалоДня(ЭтотОбъект.ДатаНачала), ВидГраницы.Включая);
ГраницаКонца = Новый Граница(КонецДня(ЭтотОбъект.ДатаОтчета), ВидГраницы.Включая); |
|||
15
VS-1976
29.10.18
✎
14:37
|
(12) Дату предавай, а не границы
|
|||
16
VS-1976
29.10.18
✎
14:40
|
(14) ГДЕ
тзСубконто.Период МЕЖДУ НАЧАЛОПЕРИОДА( &ДатаНачала, День ) И КОНЕЦПЕРИОДА( &ДатаОстатков, День ) Если не хочешь на клиенте время контралировать |
|||
17
VS-1976
29.10.18
✎
14:41
|
(16) контролировать
|
|||
18
Вафель
29.10.18
✎
14:45
|
вместо ИЛИ сделать ОБЪЕДИНИТЬ ВСЕ
|
|||
19
Вафель
29.10.18
✎
14:46
|
да и вообще тут лучше к физ. таблице обращаться
|
|||
20
VS-1976
29.10.18
✎
14:49
|
(18) ИЛИ будет лучше, чем ещё раз отбирать. Там IN будет небольшим, так как счетов не бесконечно. И будут небольшие циклы уже на отобранных данных. А ОБЪЕДИНИТЬ ВСЕ это хоть возможно и из кэша чтение ( если память MS SQL отдано много ), но всё же чтение...
|
|||
21
Вафель
29.10.18
✎
14:59
|
(20) тут или по разным полям
|
|||
22
Вафель
29.10.18
✎
14:59
|
основная цель попасть в индекс
|
|||
23
VS-1976
29.10.18
✎
15:05
|
(21) И?
рбОбороты.Регистратор = тзСубконто.Регистратор Это соединение по индексу, Далее рбОбороты.Организация = &Организация Фильтрует по организации на отобранной записи Далее циклы ( рбОбороты.СчетДт IN ( Счет1, Счет2, ... СчетN ) Или рбОбороты.СчетКт IN ( Счет1, Счет2, ... СчетN ) ) IN на сколько я понимаю не использует индексы!!! Я обычно пишу порядок в фильтре так, как оптимизатор скорее всего будет фильтровать и соединять... |
|||
24
VS-1976
29.10.18
✎
15:06
|
(23) Фильтрует по организации на отобранной записи
На поднятом кортеже с таблицы ( физическое чтение ) не в индексе А далее всё фильтруется уже просто... |
|||
25
altaykniga
29.10.18
✎
15:13
|
(6) "И тзСубконто.Значение = &Договор"
в запрос не передается параметр "&Договор", если Левое соединение делать... Как здесь быть? |
|||
26
altaykniga
29.10.18
✎
15:15
|
(25) Договор и Контрагент у нас в запр0. И вот к нему нужно через левое соединение прикрутить тзПоследнееДвижениеПоДоговору
|
|||
27
VS-1976
29.10.18
✎
15:48
|
(25) Договор выбирается где-то в виртуальную таблицу
ВЫБРАТЬ запр0.Контрагент КАК Контрагент, запр0.СуммаРазвернутыйОстатокДт КАК СуммаРазвернутыйОстатокДт запр0.Договор КАК Договор ПОМЕСТИТЬ тзДанные ИЗ ... ; ВЫБРАТЬ ИЗ тзДанные ЛЕВОЕ СОЕДИНЕНИЕ ( ВЫБРАТЬ МАКСИМУМ( тзСубконто.Период ) ИЗ РегистрБухгалтерии.Управленческий.Субконто КАК тзСубконто СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий КАК рбОбороты ПО рбОбороты.Регистратор = тзСубконто.Регистратор И рбОбороты.Организация = &Организация И ( рбОбороты.СчетДт В ИЕРАРХИИ ( &СписокСчетов ) Или рбОбороты.СчетКт В ИЕРАРХИИ ( &СписокСчетов ) ) ГДЕ тзСубконто.Период МЕЖДУ &ДатаНачала И &ДатаОстатков И тзСубконто.Вид = ЗНАЧЕНИЕ( ПланВидовХарактеристик.ВидыСубконтоУправленческие.Договоры ) И тзСубконто.Значение В ( ВЫБРАТЬ РАЗЛИЧНЫЕ Договор ИЗ тзДанные ) ) КАК тзПоследнееДвижениеПоДоговору ПО Истина Если у тебя разумеется выбирается 1 договор, если нет, то напиши, там нужно запрос подправить немного... |
|||
28
VS-1976
29.10.18
✎
15:49
|
(26) Договор подчинён контрагенту, по этому контрагент можно не использовать...
|
|||
29
altaykniga
30.10.18
✎
12:57
|
(28) VS-1976, прошу написать в личку [email protected]. Готов кинуть небольшую сумму рублей вам за помощь в написании запроса (так и не могу понять, что не так пишу в запросе)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |