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

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

Странное время выполнения запроса

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

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

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

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

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



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


В общем.. полез в Profiler
   triviumfan
 
33 - 10.05.18 - 12:35
(31) пробовал - нет.
 
 
   Мандалай
 
34 - 10.05.18 - 12:35
Попробуй вот эту строку убрать из соединений и впихнуть ее в другое место:
И (ЗначенияСвойствОбъектов.Свойство = &Свойство).
   hhhh
 
35 - 10.05.18 - 12:37
(33) только после перезагрузки компа. для чистоты эксперимента
   lodger
 
36 - 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
   lodger
 
39 - 10.05.18 - 12:41
(37) а, ну можно и так.
   triviumfan
 
40 - 10.05.18 - 12:47
(36) пришлось "грохнуть", т.к. все повисло) збс запрос)))
   lodger
 
41 - 10.05.18 - 12:49
(40) рад, что вам понравилось :)
   unregistered
 
42 - 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

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

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

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

////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////

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

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

И 

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

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

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

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

В любом случае, если даже брать таблицу итогов, то указываться периодичность (хоть "год", хоть "авто") не нужно.
   triviumfan
 
69 - 10.05.18 - 14:15
Странная эта штука, параллелизм, он то включается, то нет. Вот сейчас и для оборотов сработал. Время выполнения запроса странное, то 4 секунды, то 5, то 9.
   triviumfan
 
70 - 10.05.18 - 14:15
В общем, возьму ка я физическую таблицу... ну их нафиг эти дурные итоги.
   xXeNoNx
 
71 - 10.05.18 - 14:18
(70) только попадай в индексы)
   bolobol
 
72 - 10.05.18 - 14:19
Что п второму пункту: "НЕ Номенклатура В (" ?
Понятно одно - левое соединение с отбором по NULL. Чем оно не устраивает виртуальную таблицу, которая сама напрашивается на фильтр? Допустим, НЕ В (30000 значений из 100 тыщ всего)
   triviumfan
 
73 - 10.05.18 - 14:22
(71) Тут везде index seek.
(72) не понял вопроса
   triviumfan
 
74 - 10.05.18 - 14:23
(60) ппц, я скрины не те выложил, ахахаха
   bolobol
 
75 - 10.05.18 - 14:26
(74) Да пофиг уже - тебе же уже написали, что ты оказался умнее доброй половины))
   triviumfan
 
76 - 10.05.18 - 14:34
(68) спасибо за совет, уточню у постановщика задачи... может вообще все не так)
   xXeNoNx
 
77 - 10.05.18 - 15:10
(72) Если это мне вопрос, то использование НЕ в условии ГДЕ, может быть проблема связанная с выбором оптимизатором не верного решения. Если ничего путаю
   xXeNoNx
 
78 - 10.05.18 - 15:12
+(77) Нет, не путаю, вот ссылка:
http://www.sql-server-performance.com/2017/t-sql-where/
   xXeNoNx
 
79 - 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.
   triviumfan
 
80 - 10.05.18 - 15:14
(77) нет, он умный, это мы тупые)
   xXeNoNx
 
81 - 10.05.18 - 15:18
(80) умные иногда тоже тупят)
   bolobol
 
82 - 10.05.18 - 15:39
(79) Так тут про "Non-sargable", а у нас в примере "sargable".
   xXeNoNx
 
83 - 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
   xXeNoNx
 
84 - 10.05.18 - 15:54
(82) Рекомендую ознакомится со ВСЕЙ статьей, думаю что все вопросы отпадут
   bolobol
 
85 - 10.05.18 - 16:00
(84) в (43) порекомендуй, там не в курсе - гадости мерещатся.
   triviumfan
 
86 - 10.05.18 - 16:04
Оказалось, что нужна номенклатура с остатком, а не из физ. таблицы :)
   bolobol
 
87 - 10.05.18 - 16:06
(86), извини...

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

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

////////////////////////////////////////////////////////////////////////////////

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

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

////////////////////////////////////////////////////////////////////////////////

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

   xXeNoNx
 
98 - 11.05.18 - 10:25
(97) Будет тормозить
Какой тип у "ЗначенияСвойствОбъектов.Объект"?
А соединение с составным типом к чему может привести?
   xXeNoNx
 
99 - 11.05.18 - 10:29
(97) Использование "РегистрНакопления.ПартииТоваровКомпании.ОстаткиИОбороты" оправдано?
   xXeNoNx
 
100 - 11.05.18 - 10:59
+(99) Используй ВЫРАЗИТЬ(ЗначенияСвойств.Объект КАК Справочник.Номенклатура)
  1  2   

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