Имя: Пароль:
1C
1С v8
Как можно оптимизировать запрос
, ,
0 serg-lom89
 
17.12.14
13:49
Добрый день.
Вот пишу запрос который выполняется у документов реал-ции,у которых кол-во строк ТЧ>0,и у которых нету движения по 2 РН.

вот сам мой запрос

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

СГРУППИРОВАТЬ ПО
    РеализацияТоваровУслугТовары.Ссылка,
    ТоварыНаСкладахОбороты.Регистратор,
    ПартииТоваровНаСкладахОбороты.Регистратор

запрос отрабатывает,вот только как можно его оптимизировать?
конечно,доков много,понимаю,что перебирает их.Если есть возможность подсказать буду благодарен
1 piter3
 
17.12.14
13:50
выбрать доки нужные в вт.регистратор только реализация?
2 serg-lom89
 
17.12.14
13:56
(1) доки пока да,реализация нужно..но потом наверное еще несколько видов документов надо будет привязать
3 vicof
 
17.12.14
13:57
А ничего, что ту внутреннее соединение по факту получается?
4 serg-lom89
 
17.12.14
14:05
и думал в скд запрос тогда впихнуть затем
5 разработчик 1с
 
17.12.14
14:09
ТоварыНаСкладахОбороты.Регистратор,
    ПартииТоваровНаСкладахОбороты.Регистратор
там же всегда NULL, зачем выбирать?
6 Крошка Ру
 
17.12.14
14:10
(3) Это почему?
7 Avganec
 
17.12.14
14:11
для начала можете на регистратора навесить выразить()
8 AlexITGround
 
17.12.14
14:11
(3) Что ж с тобой сегодня? Нет, конечно, ему же нужно отобрать те, у которых нет движений при проведенных документах. Из топика я понял именно такую задачу.
9 serg-lom89
 
17.12.14
14:13
(8) да,которые проведены и нету движения по 2 РН..ну и у которых ТЧ документа>0
10 Крошка Ру
 
17.12.14
14:14
(9) Ну у которых ТЧ документа пустая, то они наверное точно не могут быть регистраторами?
По крайней мере в ТоварахНаСкладах?
11 AlexITGround
 
17.12.14
14:15
(9) Знаешь, имеет смысл оптимизировать тогда, когда ты экономишь ресурсы системные, но при этом смотришь, чтобы ресурс программиста сильно не пострадал, т.е. я к чему - данная задача очень похожа на частное применение обработки или чего-то подобного, поэтому тратить ресурс программиста на оптимизацию данного запросу не вижу целесообразным.
12 DS
 
17.12.14
14:16
На вид нормальный запрос. Попробуй вместо
И РеализацияТоваровУслугТовары.Количество > 0
написать
И НЕ РеализацияТоваровУслугТовары.Количество = 0
Но не думаю, что что-то существенно изменится.
13 Classic
 
17.12.14
14:18
Зачем тебе табличная часть?
14 Avganec
 
17.12.14
14:18
Переделай соединение с виртуальными таблицами на соединение с временными
15 Reaper_1c
 
17.12.14
14:20
Заменить виртуальные таблицы на реальные, соединение проводить по полям "период" и "регистратор".
16 afk
 
17.12.14
14:21
попробовать
задать в параметры виртуальных таблиц &Дата1 И &Дата2
не использовать виртуальные таблицы
17 vicof
 
17.12.14
14:25
(3)(8) Ну как бы левое соединение и правые условия. Я, канеш, не выспался, но всроде не до такой степени :))
18 serg-lom89
 
17.12.14
14:31
(15) заменил на реальные,сделал соединение по регистратору ,действительно быстрее начало работать
19 AlexITGround
 
17.12.14
14:34
(18) Выкладывай данные о выигрышных миллисекундах :) стоило ли оно того и как часто юзать этот запрос надобно, в каком модуле данный запрос исполняется?
20 DS
 
17.12.14
14:54
(17) Так на содержание же условий надо зрить.
21 Reaper_1c
 
17.12.14
15:20
(18) В соединение условие по периоду добавил? "Выразить" к регистратору применил?
22 serg-lom89
 
17.12.14
15:23
(21) нет не добавлял.и выразить не применял
23 serg-lom89
 
17.12.14
15:23
ВЫБРАТЬ
    РЕАЛ.НомерРеал,
    РЕАЛ.ДокРеализация,
    РЕАЛ.КолТЧ
ИЗ
    (ВЫБРАТЬ
        РеализацияТоваровУслугТовары.Ссылка.Номер КАК НомерРеал,
        РеализацияТоваровУслугТовары.Ссылка КАК ДокРеализация,
        СУММА(РеализацияТоваровУслугТовары.Количество) КАК КолТЧ
    ИЗ
        Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    ГДЕ
        РеализацияТоваровУслугТовары.Ссылка.Проведен
        И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
        И (НЕ РеализацияТоваровУслугТовары.Количество = 0)
    
    СГРУППИРОВАТЬ ПО
        РеализацияТоваровУслугТовары.Ссылка,
        РеализацияТоваровУслугТовары.Ссылка.Номер) КАК РЕАЛ
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        ПО РЕАЛ.ДокРеализация = ТоварыНаСкладах.Регистратор
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
        ПО РЕАЛ.ДокРеализация = ПартииТоваровНаСкладах.Регистратор
ГДЕ
    ПартииТоваровНаСкладах.Регистратор ЕСТЬ NULL
    И ТоварыНаСкладах.Регистратор ЕСТЬ NULL

вот запрос
24 serg-lom89
 
17.12.14
15:26
счас вот и основной вопрос...Получается нужно выбрать документы(всех типов которые делаю движение по данным РН)
с условием что было в оглавлении
25 Ёпрст
 
17.12.14
15:26
(23) ну и шо это за п..ц ?
26 Ёпрст
 
17.12.14
15:27
(23) дырку от бублика всегда возвращает, не так ли ?
27 serg-lom89
 
17.12.14
15:31
(26) всмысле???
ну я для реализации сформировал,выбило 3 дока за определенный период
28 Reaper_1c
 
17.12.14
16:36
(27) Ты таким запросом замедляешь выполнение. Соединять нужно таблицу документа (а не подзапрос), с таблицами регистров. В условиях соединения обязательно использовать условие связи и по периоду, и по регистратору.
29 alle68
 
17.12.14
18:09
(28) По периоду? А он известен? И что это даёт?
30 ILM
 
гуру
17.12.14
18:36
Я правильно понял есть два регистра накопления, и нужно найти доки реализации, которые не являются регистраторами в этих двух регистрах?
31 Славен
 
17.12.14
19:02
(30) ага внутреннее соединение с условием записи в рн null? но им еще расти до этого
32 Йохохо
 
17.12.14
19:08
(31) нету кнопки редактирования, да?
33 cathode
 
17.12.14
22:57
(0)
ВЫБРАТЬ
    Р.Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК Р
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Т
        ПО Р.Ссылка = Т.Ссылка
            И Т.НомерСтроки = 1
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК РТ
       ПО РТ.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
            И РТ.Регистратор = Р.Ссылка
            И РТ.НомерСтроки = 1
            И РТ.Активность
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК РП
       ПО РП.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
            И РП.Регистратор = Р.Ссылка
            И РП.НомерСтроки = 1
            И РП.Активность
ГДЕ
    Р.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    И Р.Проведен
    И РТ.Регистратор ЕСТЬ NULL
    И РП.Регистратор ЕСТЬ NULL
УПОРЯДОЧИТЬ ПО
    Р.Дата
    , Р.Ссылка
34 EvgeniuXP
 
17.12.14
23:17
(33) смотри план запроса - анализируй и оптимизируй.
35 Sorm
 
17.12.14
23:37
(0)  Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
        ПО РеализацияТоваровУслугТовары.Ссылка = ТоварыНаСкладахОбороты.Регистратор
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Обороты(, , Регистратор, ) КАК ПартииТоваровНаСкладахОбороты
        ПО РеализацияТоваровУслугТовары.Ссылка = ПартииТоваровНаСкладахОбороты.Регистратор  
Меня зрение обманывает, или можно сджойнить это все через Документ.РеализацияТоваровУслуг, отобрать по условиям(резко уменьшив выходной массив), и только потом сджойнить с товарами, применив условия.
36 cathode
 
17.12.14
23:43
(34) А на чем просаживается? Активность в индекс не входит, условия с ней можно и убрать. Что еще?
37 serg-lom89
 
18.12.14
08:36
(33) а можно поподробнее описать условие связи?объяснить?
38 serg-lom89
 
18.12.14
09:45
вот теперь возник вопрос,нужно еще включить в такой запрос около 10 видов документов..
как тогда лучше переделать запрос?
(мысль была что можно для каждго вида дока сделать запрос,и затем объеденить их) ,но мне кажется что идея не очень хорошая.
МОжет кто подскажет?(up тему)
39 cathode
 
18.12.14
15:56
(37) Условие "В документе есть хотя бы одна строка" можно записать как внутреннее соединение с табличной частью по ссылке и номеру строки, равному 1. В 1С 8 нумерация строк автоматическая и всегда начинается с 1, соответственно в документе, имеющем строки, будет строка с номером 1. Если требуется проверять более одной табличной части, то условие не подойдет.

Условие "Документ не имеет движений по регистру" можно записать как левое соединение с таблицей движений регистра по регистратору и номеру строки, равному 1 и затем отфильтровать строки, для которых такие записи не нашлись.

Условие на Активность из соединений с таблицами регистров лучше убрать, т.к. оно отключает использование индекса "Регистратор + Номер строки" таблицы движений регистра.
40 serg-lom89
 
18.12.14
16:14
(39) Спасибо большое)))
41 H A D G E H O G s
 
18.12.14
17:03
ВЫБРАТЬ РАЗЛИЧНЫЕ
    РеализацияТоваровУслугТовары.Ссылка
ПОМЕСТИТЬ Документы
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        ПО (ТоварыНаСкладах.Регистратор = РеализацияТоваровУслугТовары.Ссылка)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
        ПО (ПартииТоваровНаСкладах.Регистратор = РеализацияТоваровУслугТовары.Ссылка)
ГДЕ
    ТоварыНаСкладах.Регистратор ЕСТЬ NULL
    И ПартииТоваровНаСкладах.Регистратор ЕСТЬ NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Документы.Ссылка.Проведен
ИЗ
    Документы КАК Документы
ГДЕ
    Документы.Ссылка.Проведен = ИСТИНА
    И Документы.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
42 H A D G E H O G s
 
18.12.14
17:04
""
НомерСтроки = 1

Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
""


Не пытайтесь прыгнуть выше головы...
43 H A D G E H O G s
 
18.12.14
17:05
В (41) - ни одного indexscan-а, максимум - clusteredindexseek с остаточным предикатом во 2 запросе, но без него - никак.
44 H A D G E H O G s
 
18.12.14
17:08
(43) Пардон, еще один Скан по табличной части, но без него - тоже никак.
45 brawila
 
18.12.14
17:50
(41) а зачем в два запроса? почему сразу не отобрать по периоду и регистратору через Выразить ?
46 brawila
 
18.12.14
18:23
Если отбираем данные в 1 день в базе за 5 лет, то первая выборка возвращает тучу документов, в том числе непроведенные и удаленные. Уже не оптимально...
47 H A D G E H O G s
 
18.12.14
19:12
(46) ms sql не получается построить годный план запроса.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.