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


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

оптимизировать время выполнения запроса - как?

оптимизировать время выполнения запроса - как?
Я
   altaykniga
 
26.10.18 - 16:37
добрый вечер, уважаемые специалисты. Прошу подсказать, как оптимизировать время выполнения запроса.

в запросе получаю контрагентов с дебиторской задолженностью на определенную дату. Вот поля запроса:
|запр0.Контрагент КАК Контрагент,
|запр0.СуммаРазвернутыйОстатокДт КАК СуммаРазвернутыйОстатокДт,
|запр0.Договор КАК Договор

Нужно сюда еще прикрутить дату последней операции.
т.е. через левоеСоединение обратиться к РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт.

написал тект запроса для одного контрагента и договора (передаются параметрами в запрос). А как приведенный ниже запрос прикрутить к запросу выше - непонятно мне

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

Заранее благодарю за помощь!
 
 
   altaykniga
 
1 - 29.10.18 - 13:28
поднимаю.

если мой запрос написан некорректно, прошу подсказать, как составить текст запроса для получения даты последнего движения по регистру бухгалтерии с отбором: контрагент, договор, списокСчетов.
   catena
 
2 - 29.10.18 - 13:31
(1)Левое соединение, максимум(период)
   RomanYS
 
3 - 29.10.18 - 13:32
(0)
1. зачем ОборотыДтКт, есть просто Обороты
2. обязательно(для норм. производительности) указание параметра ВТ вид субконто
   RomanYS
 
4 - 29.10.18 - 13:33
*(3)
после выполнения п.1 условие на счет уйдет в параметры ВТ
   VS-1976
 
5 - 29.10.18 - 13:42
(3) Зачем обороты, когда есть физическая таблица РегистрБухгалтерии.Управленческий.Субконто? Всё равно брать лишь дату...
   VS-1976
 
6 - 29.10.18 - 14:01
(0) В общем пожалел тебя малость. Лови запрос

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

    ) КАК тзПоследнееДвижениеПоДоговору
        ПО Истина
   VS-1976
 
7 - 29.10.18 - 14:03
(6) Там немного не додумал...

ЕСТЬNULL( тзПоследнееДвижениеПоДоговору.Период, ДАТАВРЕМЯ( 1,1,1 ) ) КАК ПоследнееДвижение
   RomanYS
 
8 - 29.10.18 - 14:15
(5) там нет счетов, придется соединять ещё физ. таблицей РБ. Не факт, что будет лучше ВТ с правильно заданными параметрами
   altaykniga
 
9 - 29.10.18 - 14:29
(8) в (6) есть отбор в таблице рбОбороты
   altaykniga
 
10 - 29.10.18 - 14:29
(6) при формировании запроса выходит ошибка:

"Неверные параметры в операции сравнения. Нельзя сравнивать поля
 неограниченной длины и поля несовместимых типов.
тзСубконто.Период <<?>>МЕЖДУ &ДатаНачала И &ДатаОстатков"
 
 Рекламное место пустует
   VS-1976
 
11 - 29.10.18 - 14:31
(10) Ну а что ты а эти параметры пихаешь то? Там должны быть 2 даты. 1-я начала просмотра оборотов и 2-я дата формирования остатка. Эти даты не должны быть пустыми
   altaykniga
 
12 - 29.10.18 - 14:36
(11) в этих параметрах у меня 2 границы
   VS-1976
 
13 - 29.10.18 - 14:37
(8) Будет в любом случае лучше. Так как в ВТ в начале идёт соединение, а потом фильтрация. А у меня фильтрация и уменьшенное соединение, а потом небольшая фильтрация
   altaykniga
 
14 - 29.10.18 - 14:37
ГраницаНачала = Новый Граница(НачалоДня(ЭтотОбъект.ДатаНачала), ВидГраницы.Включая);

ГраницаКонца = Новый Граница(КонецДня(ЭтотОбъект.ДатаОтчета), ВидГраницы.Включая);
   VS-1976
 
15 - 29.10.18 - 14:37
(12) Дату предавай, а не границы
   VS-1976
 
16 - 29.10.18 - 14:40
(14) ГДЕ
        тзСубконто.Период МЕЖДУ НАЧАЛОПЕРИОДА( &ДатаНачала, День ) И КОНЕЦПЕРИОДА( &ДатаОстатков, День )

Если не хочешь на клиенте время контралировать
   VS-1976
 
17 - 29.10.18 - 14:41
(16) контролировать
   Вафель
 
18 - 29.10.18 - 14:45
вместо ИЛИ сделать ОБЪЕДИНИТЬ ВСЕ
   Вафель
 
19 - 29.10.18 - 14:46
да и вообще тут лучше к физ. таблице обращаться
   VS-1976
 
20 - 29.10.18 - 14:49
(18) ИЛИ будет лучше, чем ещё раз отбирать. Там IN будет небольшим, так как счетов не бесконечно. И будут небольшие циклы уже на отобранных данных. А ОБЪЕДИНИТЬ ВСЕ это хоть возможно и из кэша чтение ( если память MS SQL отдано много ), но всё же чтение...
   Вафель
 
21 - 29.10.18 - 14:59
(20) тут или по разным полям
   Вафель
 
22 - 29.10.18 - 14:59
основная цель попасть в индекс
   VS-1976
 
23 - 29.10.18 - 15:05
(21) И?
рбОбороты.Регистратор = тзСубконто.Регистратор

Это соединение по индексу,
Далее

рбОбороты.Организация = &Организация

Фильтрует по организации на отобранной записи

Далее циклы

( рбОбороты.СчетДт IN ( Счет1, Счет2, ... СчетN )
Или рбОбороты.СчетКт IN ( Счет1, Счет2, ... СчетN ) )

IN на сколько я понимаю не использует индексы!!!

Я обычно пишу порядок в фильтре так, как оптимизатор скорее всего будет фильтровать и соединять...
   VS-1976
 
24 - 29.10.18 - 15:06
(23) Фильтрует по организации на отобранной записи

На поднятом кортеже с таблицы ( физическое чтение ) не в индексе

А далее всё фильтруется уже просто...
   altaykniga
 
25 - 29.10.18 - 15:13
(6) "И тзСубконто.Значение = &Договор"

в запрос не передается параметр "&Договор", если Левое соединение делать... Как здесь быть?
   altaykniga
 
26 - 29.10.18 - 15:15
(25) Договор и Контрагент у нас в запр0. И вот к нему нужно через левое соединение прикрутить тзПоследнееДвижениеПоДоговору
   VS-1976
 
27 - 29.10.18 - 15:48
(25) Договор выбирается где-то в виртуальную таблицу

ВЫБРАТЬ
  запр0.Контрагент КАК Контрагент,
  запр0.СуммаРазвернутыйОстатокДт КАК СуммаРазвернутыйОстатокДт
  запр0.Договор КАК Договор

ПОМЕСТИТЬ тзДанные

ИЗ
  ...
;

ВЫБРАТЬ

ИЗ
  тзДанные

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

    ) КАК тзПоследнееДвижениеПоДоговору
        ПО Истина

Если у тебя разумеется выбирается 1 договор, если нет, то напиши, там нужно запрос подправить немного...
   VS-1976
 
28 - 29.10.18 - 15:49
(26) Договор подчинён контрагенту, по этому контрагент можно не использовать...
   altaykniga
 
29 - 30.10.18 - 12:57
(28) VS-1976, прошу написать в личку altaykniga@rambler.ru. Готов кинуть небольшую сумму рублей вам за помощь в написании запроса (так и не могу понять, что не так пишу в запросе)


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