Имя: Пароль:
1C
1С v8
Странное время выполнения запроса
0 triviumfan
 
10.05.18
11:53
Доброго дня, коллеги!
есть запрос

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

Не понимаю, почему он выполняется дольше чем этот:

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

Ведь 1й использует итоги (да, они рассчитаны за этот период), что, собственно, должно влиять на производительность сего запроса, но этого не происходит.

ЗЫ: задача - получить неликвидные товары (по ним нет движений за указанный период)
1 YaFedor
 
10.05.18
11:55
(0) 1с вообще не рекомендует соединения с виртуальными таблицами. Создай временную и с ней соединяй
2 RomanYS
 
10.05.18
11:58
Почему за основную таблицу не взята РегистрНакопления.ПартииТоваровКомпании.Обороты?
3 RomanYS
 
10.05.18
11:59
*(2) извиняюсь "НЕ" не заметил
4 Мандалай
 
10.05.18
12:00
С временной таблицей оно, конечно, кошерней. Попробуй переделать на временную.
5 triviumfan
 
10.05.18
12:01
(1) результат запроса - 1кк записей, думаешь стоит в ВТ это хранить?))
6 Мандалай
 
10.05.18
12:02
У тебя ж Различные, или у тебя прям различных миллион?
7 triviumfan
 
10.05.18
12:03
Периодичность - год... неликвид по условию задачи - товар, по которому не было движений с год. Я беру обороты с периодичностью год. Итоги должны получиться мгновенно, но 1й выполнятся за 5с, а второй за 4с (данные обработки "Инструменты разработчика" 4.35).
8 triviumfan
 
10.05.18
12:03
(6) прямо миллион:")
9 triviumfan
 
10.05.18
12:04
(8) вот так "загажена" таблица номенклатуры)
10 triviumfan
 
10.05.18
12:05
11 Timon1405
 
10.05.18
12:07
(7) Раз уж используете ИР, тыкните там(на копии!) в результатах запроса внизу на последнюю вкладку "Запрос результата", там будет кнопка "Трасса"(план запроса для лентяев). он предложит настроить техножурнал и потом выдаст вам план запроса.
12 youalex
 
10.05.18
12:08
В первом запросе РАЗЛИЧНЫЕ - не нужно

возможно, есть смысл фильтровать по свойству - в параметрах вирт. таблицы
13 Галахад
 
гуру
10.05.18
12:08
(7) А если "год" выкинуть из параметров?
14 1Сергей
 
10.05.18
12:09
(0) вообще не вижу смысла в соединении
15 Timon1405
 
10.05.18
12:12
условие на НЕ - плохое, можно попробовать полное соединение с регистром + ГДЕ регистр.номенклатура есть нулл. но без плана запроса разговор ниочем конечно
16 triviumfan
 
10.05.18
12:13
(11) попробую позже, что-то она висит)
(12) да, различные лишнее, по привычке добавил) в параметрах это будет точно лишнее
(13) ну, логично же, что будет хуже)
(14) а зря, ведь мне не нужны записи с уже установленным ПВХ "неликвид"
17 triviumfan
 
10.05.18
12:14
(15) да, тоже вариант, сейчас попробую. план будет чуть позже
18 1Сергей
 
10.05.18
12:14
(16) Для чего в запросе обращение к таблице Справочник.Номенклатура?
19 triviumfan
 
10.05.18
12:17
(18) чтобы получить номенклатуру БЕЗ ДВИЖЕНИЙ. Есть другой способ или я чего-то не знаю?!
20 lodger
 
10.05.18
12:19
(0) помимо всего вышеописанного, периодичность виртальной таблицы менять не пробовали? имхо, АВТО больше подходит.
21 triviumfan
 
10.05.18
12:19
(11) не умею настраивать ТЖ =)
22 1Сергей
 
10.05.18
12:19
(19) как-то так



ВЫБРАТЬ
    ЗначенияСвойствОбъектов.Объект
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
    ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура
    НЕ ЗначенияСвойствОбъектов.Объект В
                (ВЫБРАТЬ РАЗЛИЧНЫЕ
                    ПартииТоваровКомпанииОбороты.Номенклатура
                ИЗ
                    РегистрНакопления.ПартииТоваровКомпании.Обороты(&НачалоПериода, &КонецПериода, Год, ) КАК ПартииТоваровКомпанииОбороты)
    И (ЗначенияСвойствОбъектов.Значение ЕСТЬ NULL ИЛИ ЗначенияСвойствОбъектов.Значение = &Неликвид)
23 1Сергей
 
10.05.18
12:20
(22) + а, ну ещё условие на свойство впендюрить
24 triviumfan
 
10.05.18
12:21
(20) пробовал - разницы не вижу, хотя теоретически вряд ли оно больше подходит. кстати, ms sql 2014
25 triviumfan
 
10.05.18
12:22
(23) не у всей номенклатуры установлено свойство "неликвид", поэтому нужна основная таблица
26 Галахад
 
гуру
10.05.18
12:23
(16) А ты попробуй.
27 lodger
 
10.05.18
12:23
(22) уверены, что в ЗначенияСвойствОбъектов есть все ссылки на номенклатуру?
28 1Сергей
 
10.05.18
12:24
Ну, ок. Таблица справочника нужна.
Тогда бы сделал через временные таблицы
29 triviumfan
 
10.05.18
12:25
(26) (24)
30 triviumfan
 
10.05.18
12:26
(27) их относительно мало. Свойства установлены примерно для 5% номенклатуры.
31 hhhh
 
10.05.18
12:30
(29) попробуй наоборот пустить запросы. Есть вероятность, что sql во втором запросе использует кэш от первого запроса, поэтому 2й быстрее.
32 triviumfan
 
10.05.18
12:33
(15) разнозначно.. время одинаковое

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


В общем.. полез в Profiler
33 triviumfan
 
10.05.18
12:35
(31) пробовал - нет.
34 Мандалай
 
10.05.18
12:35
Попробуй вот эту строку убрать из соединений и впихнуть ее в другое место:
И (ЗначенияСвойствОбъектов.Свойство = &Свойство).
35 hhhh
 
10.05.18
12:37
(33) только после перезагрузки компа. для чистоты эксперимента
36 lodger
 
10.05.18
12:39
ну и для справки, сколько такой запрос займет по времени?

ВЫБРАТЬ
ЗначенияСвойствОбъектов.Объект КАК НомЛиквид
ПОМЕСТИТЬ Фильтр1
ИЗ
РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура И
ЗначенияСвойствОбъектов.Свойство = &Свойство И ЗначенияСвойствОбъектов.Значение <> &Неликвид
;
////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ПартииТоваровКомпанииОбороты.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ Фильтр2
ИЗ
РегистрНакопления.ПартииТоваровКомпании.Обороты(&НачалоПериода, &КонецПериода, Авто, НЕ Номенклатура В (Выбрать Фильтр1.НомЛиквид ИЗ Фильтр1 как Фильтр1))
ОБЪЕДИНИТЬ
Выбрать Фильтр1.НомЛиквид ИЗ Фильтр1 как Фильтр1
;
////
ВЫБРАТЬ
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.Ссылка В (Выбрать Фильтр2.Номенклатура из Фильтр2 как Фильтр2)
37 Мандалай
 
10.05.18
12:40
(36)Тогда соединение с временными таблицами и не Есть NULL
38 Мандалай
 
10.05.18
12:41
Пардон Есть NULL
39 lodger
 
10.05.18
12:41
(37) а, ну можно и так.
40 triviumfan
 
10.05.18
12:47
(36) пришлось "грохнуть", т.к. все повисло) збс запрос)))
41 lodger
 
10.05.18
12:49
(40) рад, что вам понравилось :)
42 unregistered
 
10.05.18
12:50
Объясните кто-нибудь чем это условие

  ГДЕ
    ПартииТоваровКомпанииОбороты.Номенклатура ЕСТЬ NULL
    И ВЫБОР
        КОГДА ЗначенияСвойствОбъектов.Значение ЕСТЬ NULL
             ТОГДА ИСТИНА
        ИНАЧЕ ЗначенияСвойствОбъектов.Значение = &Неликвид
      КОНЕЦ

отличается от

  ГДЕ
    ПартииТоваровКомпанииОбороты.Номенклатура ЕСТЬ NULL
    И (ЗначенияСвойствОбъектов.Значение ЕСТЬ NULL
      ИЛИ ЗначенияСвойствОбъектов.Значение = &Неликвид)
43 Мандалай
 
10.05.18
12:52
РегистрНакопления.ПартииТоваровКомпании.Обороты(&НачалоПериода, &КонецПериода, Авто, НЕ Номенклатура В (Выбрать Фильтр1.НомЛиквид ИЗ Фильтр1 как Фильтр1))

фуфуфу - дрянька редкостная, не рекомендуется в параметрах виртуальных таблиц такие вещи писать.
44 Адинэснег
 
10.05.18
13:03
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Об.Номенклатура
ПОМЕСТИТЬ ТоварыСОборотами
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты КАК Об
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗначенияСвойствОбъектов.Объект
ПОМЕСТИТЬ НеликвидПоСвойству
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
    ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура
    И ЗначенияСвойствОбъектов.Значение = ИСТИНА
    И ЗначенияСвойствОбъектов.Свойство = &Неликвид
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СпрНоменклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ ТоварыСОборотами КАК ТоварыСОборотами
        ПО СпрНоменклатура.Ссылка = ТоварыСОборотами.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ НеликвидПоСвойству КАК НеликвидПоСвойству
        ПО СпрНоменклатура.Ссылка = НеликвидПоСвойству.Объект
ГДЕ
    ТоварыСОборотами.Номенклатура ЕСТЬ NULL
    И НЕ СпрНоменклатура.ЭтоГруппа
    И НеликвидПоСвойству.Объект ЕСТЬ NULL

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    НеликвидПоСвойству.Объект
ИЗ
    НеликвидПоСвойству КАК НеликвидПоСвойству
45 bolobol
 
10.05.18
13:05
(43) Какие "такие"? Это же обычные параметры - начало, конец, условие
46 Адинэснег
 
10.05.18
13:08
+(44)сорян, под твой регистр:

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Об.Номенклатура
ПОМЕСТИТЬ ТоварыСОборотами
ИЗ
    РегистрНакопления.ПартииТоваровКомпании.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Об
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗначенияСвойствОбъектов.Объект
ПОМЕСТИТЬ НеликвидПоСвойству
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
    ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура
    И ЗначенияСвойствОбъектов.Значение = ИСТИНА
    И ЗначенияСвойствОбъектов.Свойство = &Неликвид
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗначенияСвойствОбъектов.Объект,
    ЗначенияСвойствОбъектов.Значение
ПОМЕСТИТЬ ЗначенияСвойства
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
    ЗначенияСвойствОбъектов.Свойство = &Свойство
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Товары.Ссылка,
    ЗначенияСвойства.Значение
ИЗ
    (ВЫБРАТЬ
        СпрНоменклатура.Ссылка КАК Ссылка
    ИЗ
        Справочник.Номенклатура КАК СпрНоменклатура
            ЛЕВОЕ СОЕДИНЕНИЕ ТоварыСОборотами КАК ТоварыСОборотами
            ПО СпрНоменклатура.Ссылка = ТоварыСОборотами.Номенклатура
            ЛЕВОЕ СОЕДИНЕНИЕ НеликвидПоСвойству КАК НеликвидПоСвойству
            ПО СпрНоменклатура.Ссылка = НеликвидПоСвойству.Объект
    ГДЕ
        ТоварыСОборотами.Номенклатура ЕСТЬ NULL
        И НЕ СпрНоменклатура.ЭтоГруппа
        И НеликвидПоСвойству.Объект ЕСТЬ NULL
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        НеликвидПоСвойству.Объект
    ИЗ
        НеликвидПоСвойству КАК НеликвидПоСвойству) КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияСвойства КАК ЗначенияСвойства
        ПО Товары.Ссылка = ЗначенияСвойства.Объект
47 xXeNoNx
 
10.05.18
13:10
(20) За таб. оборотов и "АВТО" - куля в лоб, выбирай из реальной таблицы!
"НЕ Номенклатура В (" - по пальцам дать.
Господа, достаньте консоль с планом запроса и посмотрите во что эти запросы преобразуются
48 1Сергей
 
10.05.18
13:14
(32) Убери ты этот ВЫБОР из ГДЕ. Сделай как в (22)
49 xXeNoNx
 
10.05.18
13:14
а ещеб я затестил:

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Об.Номенклатура
ИЗ
    РегистрНакопления.ПартииТоваровКомпании.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Об

И

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Об.Номенклатура
ИЗ
    РегистрНакопления.ПартииТоваровКомпании КАК Об
ГДЕ
   об.Период МЕЖДУ &НачалоПериода И &КонецПериода
50 xXeNoNx
 
10.05.18
13:16
+(49) Кстати в первом варианте "РАЗЛИЧНЫЕ" - не нужны, оно будет замедлять
51 1Сергей
 
10.05.18
13:27
(50) в данном случае да
52 bolobol
 
10.05.18
13:43
Т.е. нет смысла в получении оборотов, рассчитанных в виртуальной таблице, если не просить детализацю расчёта по периоду внутри интересующего периода оборота? Чё за дичь?
53 bolobol
 
10.05.18
13:46
Правильнее заставить систему посчитать сумму по группировке из измерений?
54 xXeNoNx
 
10.05.18
13:53
(52) Зависит от периодичности.
55 bolobol
 
10.05.18
13:59
(54) Да что зависит-то? Если цель виртуальной таблицы - представить предподготовленные отчётные данные.
Периодичность - месяц, запрос за год, в месяц движений 273000. Предлагаете 12 * 273000 строк заново посчитать? И это будет быстрее, чем система сложит 12х цифр?
56 xXeNoNx
 
10.05.18
14:01
(52) Детализация АВТО, как думаешь во что разворачивает твой запрос по регистру оборотов платформа?

Открой чистую СКД, сделай выборку по регистру оборотов, поставь периодичность АВТО, посмотри поля которые можно выбрать и поставь периодичность МЕСЯЦ и так же посмотри что там можно выбрать

А шлифануть: Возми консоль с планом запроса, сначала посмотри "гибридный запрос", который платформа генерит с периодичностью АВТО, а затем с периодичностью МЕСЯЦ.
57 xXeNoNx
 
10.05.18
14:02
+(56) а если ее приаттачить левым соединением к чему-нить.., тут туши свет
58 xXeNoNx
 
10.05.18
14:02
(55) Оно все равно складывает, неявно для Вас
59 xXeNoNx
 
10.05.18
14:04
(55) Периодичность должна быть больше месяца, тогда это имеет смысл...
60 triviumfan
 
10.05.18
14:04
(15) запрос с оборотами
https://yadi.sk/i/PUi-dNe73VfRVt
Запрос с физ таблицей
https://yadi.sk/i/PUi-dNe73VfRVt

Параллелизм...
61 xXeNoNx
 
10.05.18
14:05
"Если цель виртуальной таблицы - представить предподготовленные отчётные данные." - цель виртуальной таблицы - облегчить жизнь 1с-программистам
62 triviumfan
 
10.05.18
14:05
63 triviumfan
 
10.05.18
14:07
параллельное выполнение даёт около 20% выигрыша)
64 bolobol
 
10.05.18
14:10
Запрос с физ таблицей выполнился в 10 раз дольше - это выигрыш в 20% ?
Срочно - в спортлото! Не, обыгрывать вулкан через телеграмм!
65 Мандалай
 
10.05.18
14:10
Чувак, ты сейчас только что оказался умнее половины тех, кто тебе давал советы :)
66 xXeNoNx
 
10.05.18
14:11
(63) неужели
67 xXeNoNx
 
10.05.18
14:12
Никто не говорит что нельзя использовать вирт Таблицу оборотов, можно, но нужно знать когда это может привести к проблемам
68 unregistered
 
10.05.18
14:13
Тут еще вопрос методический, зависящий от того как построена работа этого регистра. Может быть такое, что возвраты отражаются путём формирования записей с минусом (продажа - расход с "плюсом", а возврат - расход с "минусом"). Тогда в итоговых таблицах оборотов такой номенклатуры может не быть (если продали 10, а потом вернули -10, то 10-10=0).
В таких случаях корректнее обращаться к таблице первичных движений.

В любом случае, если даже брать таблицу итогов, то указываться периодичность (хоть "год", хоть "авто") не нужно.
69 triviumfan
 
10.05.18
14:15
Странная эта штука, параллелизм, он то включается, то нет. Вот сейчас и для оборотов сработал. Время выполнения запроса странное, то 4 секунды, то 5, то 9.
70 triviumfan
 
10.05.18
14:15
В общем, возьму ка я физическую таблицу... ну их нафиг эти дурные итоги.
71 xXeNoNx
 
10.05.18
14:18
(70) только попадай в индексы)
72 bolobol
 
10.05.18
14:19
Что п второму пункту: "НЕ Номенклатура В (" ?
Понятно одно - левое соединение с отбором по NULL. Чем оно не устраивает виртуальную таблицу, которая сама напрашивается на фильтр? Допустим, НЕ В (30000 значений из 100 тыщ всего)
73 triviumfan
 
10.05.18
14:22
(71) Тут везде index seek.
(72) не понял вопроса
74 triviumfan
 
10.05.18
14:23
(60) ппц, я скрины не те выложил, ахахаха
75 bolobol
 
10.05.18
14:26
(74) Да пофиг уже - тебе же уже написали, что ты оказался умнее доброй половины))
76 triviumfan
 
10.05.18
14:34
(68) спасибо за совет, уточню у постановщика задачи... может вообще все не так)
77 xXeNoNx
 
10.05.18
15:10
(72) Если это мне вопрос, то использование НЕ в условии ГДЕ, может быть проблема связанная с выбором оптимизатором не верного решения. Если ничего путаю
78 xXeNoNx
 
10.05.18
15:12
+(77) Нет, не путаю, вот ссылка:
http://www.sql-server-performance.com/2017/t-sql-where/
79 xXeNoNx
 
10.05.18
15:13
+(78) А именно:
Non-sargable search arguments in the WHERE clause, such as “IS NULL”, “<>”, “!=”, “!>”, “!<“, “NOT”, “NOT EXISTS”, “NOT IN”, “NOT LIKE”, and “LIKE ‘%500′” generally prevents (but not always) the query optimizer from using a useful index to perform a search. In addition, expressions that include a function on a column, expressions that have the same column on both sides of the operator, or comparisons against a column (not a constant), are not sargable.
80 triviumfan
 
10.05.18
15:14
(77) нет, он умный, это мы тупые)
81 xXeNoNx
 
10.05.18
15:18
(80) умные иногда тоже тупят)
82 bolobol
 
10.05.18
15:39
(79) Так тут про "Non-sargable", а у нас в примере "sargable".
83 xXeNoNx
 
10.05.18
15:53
Вот тут sargable(72)?
Не вижу.

Если еще нужно, для sargable, то вот:
If you currently have a query that uses NOT IN, which offers poor performance because the SQL Server optimizer has to use a scan to perform this activity, instead try to use one of the following options, all of which offer better performance:

    Use EXISTS or NOT EXISTS.
    Use IN.
    Perform a LEFT OUTER JOIN and check for a NULL condition
84 xXeNoNx
 
10.05.18
15:54
(82) Рекомендую ознакомится со ВСЕЙ статьей, думаю что все вопросы отпадут
85 bolobol
 
10.05.18
16:00
(84) в (43) порекомендуй, там не в курсе - гадости мерещатся.
86 triviumfan
 
10.05.18
16:04
Оказалось, что нужна номенклатура с остатком, а не из физ. таблицы :)
87 bolobol
 
10.05.18
16:06
(86), извини...

(84) А конструкция "Use EXISTS or NOT EXISTS." - как в 1С выглядит?
88 xXeNoNx
 
10.05.18
16:16
(87) не встречался
89 bolobol
 
10.05.18
16:39
И, получается, что не исключать из выборки 30% ненужного выгодно, а соединять с 70% нужного. Да, про то я забыл совсем, про ограничение такое в эскуэль
90 bolobol
 
10.05.18
16:59
(86) Так а вопрос какой-то актуальным остался?
Просто, даже из (0) - разница 4 и 5 секунд - ниочём. Вот 35 секунд 5 секунд - это показатель. И такое реально бывает, индексировать временные таблицы приходится, например
91 xXeNoNx
 
10.05.18
17:14
(89)
"что не исключать из выборки 30% ненужного выгодно, а соединять с 70% нужного" - ну почему же не исключать, исключать ненужное крайне желательно. Все становится очевидно(или нет), когда посмотришь план выполнения запроса.
92 bolobol
 
10.05.18
17:19
(91) Эх, знал бы я, как смотреть план... Да у меня и базы такой нет, чтобы увидеть разницу. Нет запроса, выполняющегося дольше 5 секунд
93 xXeNoNx
 
10.05.18
17:21
(92) Консоль запросов на ИТС, подойдут любые запросы по регистру оборотов
94 youalex
 
10.05.18
19:33
(87) эмулируется как ГДЕ 1 В (ВЫБРАТЬ Первые 1 1 ИЗ...)
95 triviumfan
 
10.05.18
20:09
(90) Для меня разница в секунду существенна) Поэтому я и запили тему. Кстати, планы запросов оказались почти идентичны, оба распралаллеливаются, но есть тонкие отличия в логике, думаю, даже нет смысла спрашивать их тут =)

Т.к. постановка задачи была изменена, то для решения достаточно виртуальной "ОстаткиИОбороты".

ВЫБРАТЬ
    ЗначенияСвойствОбъектов.Объект КАК Номенклатура
ПОМЕСТИТЬ Неликвиды
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
    ЗначенияСвойствОбъектов.Свойство = &Свойство
    И ЗначенияСвойствОбъектов.Значение = &Неликвид
;

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

Проверил - результат вроде правильный, и выполняется около секунды.
96 triviumfan
 
10.05.18
20:11
(95) Наверное, лучше соединением фильтровать/исключать, но точно не в параметрах ВТ :)
97 triviumfan
 
10.05.18
20:18
Исправим, а то закидают помидорками:)
ВЫБРАТЬ
    ЗначенияСвойствОбъектов.Объект КАК Номенклатура
ПОМЕСТИТЬ Неликвиды
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
    ЗначенияСвойствОбъектов.Свойство = &Свойство
    И ЗначенияСвойствОбъектов.Значение = &Неликвид
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПартииТоваровКомпанииОстаткиИОбороты.Номенклатура КАК Номенклатура,
    ПартииТоваровКомпанииОстаткиИОбороты.КоличествоКонечныйОстаток
ИЗ
    РегистрНакопления.ПартииТоваровКомпании.ОстаткиИОбороты(&НачалоПериода, , , , ) КАК ПартииТоваровКомпанииОстаткиИОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ Неликвиды КАК Неликвиды
        ПО ПартииТоваровКомпанииОстаткиИОбороты.Номенклатура = Неликвиды.Номенклатура
ГДЕ
    ПартииТоваровКомпанииОстаткиИОбороты.КоличествоРасход = 0
    И ПартииТоваровКомпанииОстаткиИОбороты.КоличествоПриход = 0
    И Неликвиды.Номенклатура ЕСТЬ NULL
98 xXeNoNx
 
11.05.18
10:25
(97) Будет тормозить
Какой тип у "ЗначенияСвойствОбъектов.Объект"?
А соединение с составным типом к чему может привести?
99 xXeNoNx
 
11.05.18
10:29
(97) Использование "РегистрНакопления.ПартииТоваровКомпании.ОстаткиИОбороты" оправдано?
100 xXeNoNx
 
11.05.18
10:59
+(99) Используй ВЫРАЗИТЬ(ЗначенияСвойств.Объект КАК Справочник.Номенклатура)
101 Timon1405
 
11.05.18
11:16
(98) (100) вы не понимаете о чем пишете
соединение с составным типом тормозит когда из него получается реквизит через точку. а ЗначенияСвойствОбъектов.Объект КАК Номенклатура
и так ссылочный тип номенклатура, не нужно ничего выражать
102 xXeNoNx
 
11.05.18
11:36
(101) Откуда Вам знать что я понимаю, а что нет?  "Зарапартовался"
103 VS-1976
 
11.05.18
11:42
Выполняется дольше, по тому что ты в первом запросе используешь виртуальную таблицу, которая выгребает в том числе и остатки, а во втором случае физическую таблицу. Так как номенклатура содержится в индексе, то чтение всей таблицы не происходит, а только индекса скорее всего. А вообще правильнее на мой взгляд писать запрос таким образом, но и он скорее всего не оптимален но достаточен:

ВЫБРАТЬ
    спрНоменклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК спрНоменклатура

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

    ) КАК тзФильтр
        ПО спрНоменклатура.Ссылка = тзФильтр.Номенклатура

    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК тзЗначения
        ПО спрНоменклатура.Ссылка = тзЗначения.Объект
         И тзЗначения.Свойство = &Свойство
ГДЕ
    тзФильтр.Номенклатура ЕСТЬ NULL
    И ( тзЗначения.Значение ЕСТЬ NULL Или тзЗначения.Значение = &Неликвид )
104 Повелитель
 
11.05.18
11:44
(0)
(7) 1й выполнятся за 5с, а второй за 4с

Тема не о чем. Весь сыр бор из 1 секунды!

Допустим твой час стоит 1000 рублей.
Ты на форуме провисел 8 часов, затратил на оптимизацию 8000 рублей. Оптимизацию в 1 секунду?
Директор бы увидел, уволил.
105 VS-1976
 
11.05.18
11:47
(104) На разном железе с разным периодом может быть разница не в секунду... А так нужно сразу стараться писать правильно и всё не будет никаких 2-х вариантов.
106 xXeNoNx
 
11.05.18
11:52
(103) Соединение с подзапросом?
107 Повелитель
 
11.05.18
11:55
(105) Если отчет используют десятки или сотни раз в день, то его стоит оптимизировать.

Если его используют 1 раз в неделю, а такие отчеты как в (0) используют не часто, да пусть он хоть 30 секунд выполняется.
108 VS-1976
 
11.05.18
11:58
(107) Это да. Но мозг прокачивать всё же нужно, так что пусть тренеруется