|   |   | 
| 
 | Запрос. Перенос условия из ГДЕ в параметры ВТ дает замедление | ☑ | ||
|---|---|---|---|---|
| 0
    
        cons74 01.07.16✎ 21:22 | 
        В типичных причинах неоптимальных запросов (https://its.1c.ru/db/metod8dev#content:5842:hdoc) рекомендуется условия на виртуальные таблицы накладывать в параметрах, а не в ГДЕ.
 В моем же примере это дает замедление 30-40%. Почему? "Быстрый запрос" 
"Медленный запрос" 
 | |||
| 1
    
        RomanYS 01.07.16✎ 21:28 | 
        может меришь не правильно? Время выполнения какое?     | |||
| 2
    
        Lexey_ 01.07.16✎ 21:30 | 
        (0) минимум дату не туда пишешь: РегистрНакопления.Обороты(&НачалоПериода, &КонецПериода, , )     | |||
| 3
    
        cons74 01.07.16✎ 21:32 | 
        (1) быстрый 1,000 медленный 1,300
 (2)какую еще дату?! | |||
| 4
    
        floody 01.07.16✎ 21:35 | 
        Автор, что сказать-то хотел?     | |||
| 5
    
        Armando 01.07.16✎ 21:35 | 
        Покажи планы запросов     | |||
| 6
    
        floody 01.07.16✎ 21:36 | 
        Условия надо нормальные писать, которые попадают в индексы.     | |||
| 7
    
        MishaD 01.07.16✎ 21:36 | 
        Для виртуальных таблиц вроде как группировка не нужна.     | |||
| 8
    
        floody 01.07.16✎ 21:37 | 
        Вместо "В" иногда лучше внутреннее или левое соединение.     | |||
| 9
    
        RomanYS 01.07.16✎ 21:38 | 
        я бы ещё попробовал разделить условия: простые (договор и контрагент) в параметры, а ДокументПродажи.Дата в ГДЕ     | |||
| 10
    
        RomanYS 01.07.16✎ 21:39 | 
        (3) замерь (9)     | |||
| 11
    
        cons74 01.07.16✎ 21:49 | 
        (9),(10) видимо причину замедления мы нашли - теперь скорость одинаковая. Но я - то хотел ускорить исходный запрос.     | |||
| 12
    
        RomanYS 01.07.16✎ 21:54 | 
        (11) ну можно засунуть классификацию номенклатуры в отдельную ВТ, и вместо ПродажиОбороты.Номенклатура.СрокГодностиТовара.КоличествоСуток делать явное левое соединение     | |||
| 13
    
        RomanYS 01.07.16✎ 21:56 | 
        ещё проанализировать есть ли ситуации, где ДокументПродажи.Дата отличается от Период. Может можно упростить     | |||
| 14
    
        mehfk 01.07.16✎ 22:01 | 
        (0) 1. Анализируй текст(ы) запроса(ов) SQL, а не исходный(е).
 2. Оба запроса - гогно. | |||
| 15
    
        cons74 01.07.16✎ 22:07 | 
        (14)2 - так я ж пытаюсь их оптимизировать. Кто-то писал, а я - разгребаю...     | |||
| 16
    
        cons74 01.07.16✎ 22:09 | 
        (12) это уже лишнее:
 Итог: с 1 сек на 0,013 :))) По рекомендациям http://курсы-по-1с.рф/articles/как-в-1с-оптимизировать-запрос/ создал предварительную ВТ с объединением выборок ссылок из документов, а уже потом здесь "ДокументПродажи в (выбрать ВТ_Док.ссылка из ВТ_Док)". | |||
| 17
    
        Злопчинский 01.07.16✎ 22:09 | 
        (14)  какие одинэсники такие и запросы
 Бугага стораз хихи | |||
| 18
    
        mehfk 01.07.16✎ 22:13 | 
        ну и КоличествоСуток - если дофига где используется, то напрашивается денормализация
 Ссылочный тип - СрокГодностиТовара тоже улыбно :) | |||
| 19
    
        cons74 01.07.16✎ 22:21 | 
        (16) поспешил
 Неправильно составил вт. Не получается ускорения все-таки. | |||
| 20
    
        RomanYS 01.07.16✎ 22:24 | 
        (19) убери "ВЫБОР...", сделай замер. Если результат устроит, думай, что с этой конструкцией делать     | |||
| 21
    
        cons74 01.07.16✎ 22:31 | 
        (20) ну да, быстрее. Блин, обидно - все усилия по ДокументПродажи.Дата впустую. Не в нем дело видимо, а в Номенклатура.СрокГодностиТовара.КоличествоСуток     | |||
| 22
    
        cons74 01.07.16✎ 22:32 | 
        (12) можно чуть поподробнее?     | |||
| 23
    
        cons74 01.07.16✎ 22:47 | 
        а то стало только хуже
 
 | |||
| 24
    
        floody 01.07.16✎ 22:50 | 
        Предлагаю посмотреть план запроса и оттуда плясать.     | |||
| 25
    
        Cyberhawk 01.07.16✎ 22:54 | 
        Ты еще учитывай при замерах, что первый замер только разогревает кэш СУБД...     | |||
| 26
    
        4St 02.07.16✎ 11:40 | 
        (23) ПродажиОбороты.ДоговорКонтрагента.Ссылка В(&ДоговорыКонтрагента)
 Меняй на ПродажиОбороты.ДоговорКонтрагента В(&ДоговорыКонтрагента) То же самое с контрагентом. Но реальные тормоза почти наверняка вызывает ПродажиОбороты.ДокументПродажи.Дата <= &КонДатаПродаж Поле ДокументПродажи часом не составное? Сколько в нем типов данных? В чем смысл фильтрации регистра оборотов по дате документа вместо использования интервала дат в параметрах виртуальной таблицы? | |||
| 27
    
        4St 02.07.16✎ 11:45 | 
        (23) и ещё, первую ВТ хорошо бы проиндексировать по НоменклатураСсылка.
 А также Выбрать Различные на всякий случай, а ещё лучше - сгруппировать по номенклатуре, а срокгодности взять max/min. По второму запросу - надо решить, как в отчете должны отражаться возвраты от покупателей. Если их нет, например, то фильтр дат задавать обычными параметрами вт. | |||
| 28
    
        Cyberhawk 02.07.16✎ 11:54 | 
        (26) "В чем смысл фильтрации регистра оборотов по дате документа вместо использования интервала дат в параметрах виртуальной таблицы?" // Такое имеет смысл только если документ делает движения не своей датой, в случае с "ПродажиОбороты" это может быть только какая-то допилка "сбоку" по какому-нибудь планированию. Но вряд ли это случай автора.
 (27) "первую ВТ хорошо бы проиндексировать по НоменклатураСсылка" // Зачем, если выборка из нее далее выполнятется только один раз? | |||
| 29
    
        4St 02.07.16✎ 12:14 | 
        (28) я об этом:
 ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СуткиГодности КАК ВТ_СуткиГодности ПО ПродажиОбороты.Номенклатура = ВТ_СуткиГодности.НоменклатураСсылка Соединять лучше по индексированному полю. А затраты на индексацию должны быть незначительны. | |||
| 30
    
        PR 02.07.16✎ 12:47 | 
        Поразительно, ни одной фразы про отбор в ПВТ по полю через точку.
 (0) ТС, убери из ПВТ отбор по Документ.Дата, сделай его в ГДЕ. Или сделай отбор не по Документ.Дата, а по Документ в списке, который до этого вычисли по отбору по дате. | |||
| 31
    
        4St 02.07.16✎ 12:52 | 
        (30) Почему же, в (26) как раз об этом писал.
 Есть подозрение, что надо копнуть саму постановку задачи. Возможно, все удастся свести к обычному фильтру по периоду в виртуальной таблице. Либо понять, что под данную задачу нужен отдельный регистр / отдельное поле "ДатаДокументаПродажи" в РН "Продажи". | |||
| 32
    
        PR 02.07.16✎ 12:55 | 
        (31) А, ну да, просмотрел
 Кстати, фильтр по дате документа вполне может иметь смысл, почему нет-то? Документ продажи <> Регистратор. | |||
| 33
    
        4St 02.07.16✎ 13:03 | 
        (32) Разумеется. О том и речь, что надо понять, что должно произойти, когда ДокументПродажи<>Регистратор, и есть ли такое вообще. Например, в компании не используются возвраты\корректировки реализации. Или внезапно окажется, что движения по таким документам надо все-таки отражать именно в их периоде действия. Иногда заказчик, отвечая повторно на такие запросы, хлопает себя по лбу и говорит "а, ну да, все совсем не так!" ))     | |||
| 34
    
        echo77 02.07.16✎ 16:54 | 
        (0) Отбор с помощью параметров ВТ не всегда приводит к ускорению, особенно, если вы не попадаете в индекс     | |||
| 35
    
        mikeA 02.07.16✎ 18:41 | 
        (20) попробуй заменить
 ВЫБОР КОГДА ПродажиОбороты.Номенклатура.СрокГодностиТовара.КоличествоСуток < 10 ТОГДА 1 ИНАЧЕ ВЫБОР КОГДА ПродажиОбороты.Номенклатура.СрокГодностиТовара.КоличествоСуток >= 10 И ПродажиОбороты.Номенклатура.СрокГодностиТовара.КоличествоСуток <= 30 ТОГДА 2 ИНАЧЕ 3 КОНЕЦ КОНЕЦ на ВЫРАЗИТЬ(-40/(ПродажиОбороты.Номенклатура.СрокГодностиТовара.КоличествоСуток + 10) + 3.500000001 КАК ЧИСЛО(10, 0)) ну так, чиста чтоб поржать)) | |||
| 36
    
        cons74 26.07.16✎ 15:40 | 
        короче убрал Контрагента, оставил Договор. Получилось быстрее (как понял, за счет отсутствия лишнего условия по индексу, а индекс-то не непрерывный по таким-то условиям).     | |||
| 37
    
        ViSo76 26.07.16✎ 16:44 | 
        Пробуй так куски вставив по месту и заменив на правильное наименование справочника "ПравильноеНаименованиеСправочника"
 ВЫБРАТЬ НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ) КАК ДатаДок, ВЫБОР КОГДА НЕ &ОтсрочкаПоСрокамГодностиТовара ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА спрСрокГодностиТовара.КоличествоСуток < 10 ТОГДА 1 ИНАЧЕ ВЫБОР КОГДА спрСрокГодностиТовара.КоличествоСуток >= 10 И спрСрокГодностиТовара.КоличествоСуток <= 30 ТОГДА 2 ИНАЧЕ 3 КОНЕЦ КОНЕЦ КОНЕЦ КАК ОтсрочкаОплаты, ... ИЗ РегистрНакопления.Продажи.Обороты( , , &КонДатаПродаж, Контрагент = &Контрагент И ДоговорКонтрагента В ( &ДоговорыКонтрагента ) ) КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК спрНоменклатура ПО спрНоменклатура.Ссылка = ПродажиОбороты.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ Справочник."ПравильноеНаименованиеСправочника" КАК спрСрокГодностиТовара ПО спрСрокГодностиТовара.Ссылка = спрНоменклатура.СрокГодностиТовара | |||
| 38
    
        ViSo76 26.07.16✎ 16:46 | 
        Ошибся малость
 РегистрНакопления.Продажи.Обороты( , &КонДатаПродаж, , | |||
| 39
    
        Dmitrii гуру 26.07.16✎ 17:22 | 
        (32) (33) Даже если ДокументПродажи <> Регистратор, это не мешает нам поставить условие виртуальной таблицы на КонецПериода <= &КонДатаПродаж
 Т.к. даже в случаях возвратов или последующих каких-то движений молавероятна ситуация, когда Период в регистре будет < ДокументПродажи.Дата Не может быть возврат раньше документа продажи. Кроме того, я быпоставил условие на параметр виртуальной таблицы &НачалоПериода. Учитывая сроки годности, исчисляемые сутками, можно например влепить пол года от &КонДатаПродаж. И вообще таблицу Обороты имеет смысл использовать, когда речь идёт о выборке по ограниченному периоду. Если ограничить период никак нельзя, то физическая таблица первичных движений частенько работает быстрее. Что и наблюдается у автора в (0). | |||
| 40
    
        kiruha 26.07.16✎ 17:37 | 
        (0)
 За такое И ДокументПродажи.Дата <= &КонДатаПродаж сразу увольнять | |||
| 41
    
        Fragster гуру 26.07.16✎ 17:40 | 
        если скорость обработки данных зависит от срока эксплуатации системы - это значит, что данные организованы неправильно. в данном случае чем больше времени проходит - тем дольше будет выполняться запрос. это неправильно, следует подумать об изменении структуры.     | |||
| 42
    
        ViSo76 26.07.16✎ 18:02 | 
        (39) Где у автора в запросе таблица первичных движений?     | |||
| 43
    
        Necessitudo 26.07.16✎ 18:07 | 
        (42) Таблица "Обороты" строится на объединении таблицы итогов и таблицы движений.     | |||
| 44
    
        ViSo76 26.07.16✎ 18:32 | 
        (43) 1. Ты путаешь ОстаткиИОбороты
 2. РегистрНакопления.Продажи.Обороты не одно и тоже что и РегистрНакопления.Продажи | |||
| 45
    
        Sammo 26.07.16✎ 20:27 | 
        Обращение через 2 точки - это неявное соединения с таблицами всех типов, которые входят в документы продажи.
 В первом случае ты выбираешь обороты и потом к этому накладываешь соединения. Во втором ты накладываешь соединения и от всего этого разнообразия выцарапываешь обороты. Две точки зло. Ну номенклатуру предварительно подготовить Проблема с подобными запросами, что они на небольших объемах данных могут работать быстро. А когда объем данных растет, то план запроса может строиться по-иному. Причем невсегда предсказуемо. Поэтому переходить на ВТ - это позволит как-то прогнозировать план запроса вне зависимости от данных P.S. видел как отказ от вложенных запросов, отказ от двух точек и переход на ВТ существенно ускорял запросы, которые на больших объемах данных внезапно стали тупить | |||
| 46
    
        echo77 26.07.16✎ 20:41 | 
        (40) Вы не учитываете особенность данного регистра - запиши пишут не только документы продажи(РТУ, Акт об оказании услуг) но и Корректировка реализации - которая не сильно кого интересует, т.к. продажа могла состояться в другом периоде.
 Эта особенность и приводит к такому условию | |||
| 47
    
        wertyu 26.07.16✎ 20:54 | 
        (0) второе поле запроса составлено криво, для читаемости надо так: выбор когда параметр тогда {тут выбор по количеству 1,2,3} иначе 0 конец     | |||
| 48
    
        wertyu 26.07.16✎ 21:02 | 
        +(47) {выбор по количеству}:
 выбор когда 10 тогда 1 когда 10 и 30 тогда 2 иначе 3 конец | |||
| 49
    
        wertyu 26.07.16✎ 21:05 | 
        а в последнем поле естьnull и сумма поменять местами     | |||
| 50
    
        ViSo76 26.07.16✎ 22:43 | 
        (46) У тебя движения зафиксированы в регистре с датой в поле "период" даже если у документа отличная дата то нужно использовать дату фиксации движений, а не дату документа, которая обычно = дате движения. По этому все неявные соединения со всеми возможными документами регистратора это плохой тон. Даже если и хочется использовать дату документов, то можно из физической таблицы считать данные <= &КонДатаПродаж вытащить ( РАЗЛИЧНЫЕ ) регистраторы в ВТ и там уже сделать неявное соединение документами с фильтрацией по дате. Так будет уменьшено количество соединений существенно, особенно если товара много в документах.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |