как оптимизировать запрос 1с 8 #739339


#0 by Anabella
Есть вот такой запрос. И он здорово тормозит отчет. Как его оптимизировать? Спасибо.     ВЫБОР         КОГДА ЗаказыКлиентовОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
#0 by Anabella
Есть вот такой запрос. И он здорово тормозит отчет. Как его оптимизировать? Спасибо.     ВЫБОР         КОГДА ЗаказыКлиентовОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
#1 by User_Agronom
а что такое ВТ?
#2 by Ненавижу 1С
сомнительного свойства запрос
#3 by Anabella
И ещё замер производительности выдает что тормозит вот эта строчка. Можно что-то подкрутить в настройках интерфейса СКД чтобы было быстрее?
#4 by WebberNSK
1. отбор в условия виртуальной таблицы 2. виртуальную таблицу во временную пересмотреть состав накладываемых условий
#5 by butterbean
если он вызывается 100500 раз в цикле/, то понятно почему отчет тормозит
#6 by Anabella
временная таблица
#7 by Fragster
.Обороты(&МоментВремениРегистратора, &МоментВремениРегистратора, ...
#8 by Anabella
ВТ - это временная таблица. Или я в терминах ничего не понимаю. Но вообще-то это МенеджерВременныхТаблиц.
#9 by Fragster
+ и из ГДЕ после этого условие можно убрать
#10 by Anabella
спасибо, сейчас попробую!!!
#11 by AlexITGround
Первое понятно, прошу аргументировать второе.
#12 by Simod
Если выбираются обороты по одному документу, то виртуальная таблица не нужна.
#13 by ViSo76
Можно и не обращаться к виртуальной таблице Обороты. Можно просто отобрать по регистратору непосредственно из РегистрНакопления.ЗаказыКлиентов, если что свернуть по номенклатуре и потом соединить.
#14 by Anabella
Насколько я знаю всегда быстрее отчет работает если обращаться к виртуальным таблицам, а не к самому регистру.
#15 by Anabella
или это не так ?
#16 by vi0
какую задачу решаешь запросом? может быть анализировать приход/расход и не задействовать регистратор?
#17 by ViSo76
Это было бы так если бы было обращение к остаткам, а обороты будет строиться из РегистрНакопления.ЗаказыКлиентов применяя группировку по , Регистратор, и выбранные измерения в ВЫБРАТЬ. В вашем случае вы вытаскиваете все движения по регистру накопления за все время, они группируются по правилу выше, потом ( если это MS SQL ) режется по ГДЕ и потом делается ЛЕВОЕ СОЕДИНЕНИЕ, если файловая то левое соединение будет первым потом урезка по ГДЕ ( вроде так )
#18 by Гёдза
тут таблица оборотов и не нужна
#19 by vi0
попробуй проиндексировать ВТ по Номенклатура
#20 by Anabella
задача следующая: "покажи мне какая номенклатура была оплачена!" мне приходится собирать все документы оплаты, а потом по каждому документу оплаты проверять документ-основание (реализация или заказ), и сумму оплаты разносить по всем позициям номенклатуры этого документа.
#21 by Anabella
Сделала так: РегистрНакопления.ЗаказыКлиентов.Обороты(&МоментВремени, &МоментВремени, , ) не прокатило, по моменту времени он ничего не находит.
#22 by Anabella
спасибо за объяснение, сейчас попробую
#23 by vi0
а ЗаказыКлиентов двигают документы оплаты?
#24 by vi0
в регистр ЗаказыКлиентов пишут документы оплаты?
#25 by AndreyBarmaley
Добавь в параметру виртуальной таблицы отбор по номенклатуре из ВТ ИЗ     РегистрНакопления.ЗаказыКлиентов.Обороты( , Номенклатура В (ВЫБРАТЬ ВТ.Ссылка ИЗ ВТ КАК ВТ) , Регистратор, ) КАК ЗаказыКлиентовОборот
#26 by Anabella
нет, сначала я из другого регистра достаю документы оплаты и документ-основание, а потом по документ-основание делаю запрос, который вы и видите выше. я пыталась реализовать это в одном запросе, но, честно говоря, такая ерунда получилась...
#27 by vi0
у вас в одном документе реализации только одна номенклатура? если нет, то вы уверены что задача методически верна сама по себе?
#28 by vi0
тут надо понять что именно содержит ВТ а то, теоритически, такое условие может наоборот замедлить запроса
#29 by Anabella
Нет, не одна. Но отчет выдает правильный результат. Методически это решение кажется мне наиболее правильным, но я, конечно, могу ошибаться. Насчет ВТ. Начальник пожелал чтобы номенклатура была разбита на 6 разделов в отчете - инвентарь, оборудование итп. Проще всего было реализовать это, просто разместив её по 6 нужным папкам. Но "менеджеры привыкли к текущей схеме, менять нельзя"! Пришлось пойти обходным путем. Вот запрос ВТ: ВЫБРАТЬ
#30 by МихаилМ
условия лучше указывать в условиях виртуальной таблицы   ВЫБОР         КОГДА ЗаказыКлиентовОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг это действие относится не к выботке данных а к представлению данных. соответственно обрабатывайте не на субд.
#31 by Anabella
спасибо!
#32 by vi0
это не факт если важна скорость то нужно замеры делать, где будет быстрее на сервере или клиенте
#33 by vi0
вы же понимаете, что такой хардкодинг потенциально неустойчивый?
#34 by ViSo76
К стати ЗаказыКлиентовОбороты.СуммаОборот * -1 достаточно заменить на -ЗаказыКлиентовОбороты.СуммаОборот перемножения не будет
#35 by AndreyBarmaley
Я бы в ВТ еще бы оплаченные заказы клиента добавил: ИЗ     РегистрНакопления.ЗаказыКлиентов.Обороты(             ,             ,
#36 by vi0
тогда совет в точно не нужен
#37 by D_E_S_131
Если нужно получить движения документа по регистру "ЗаказыКлиентов" с условием по номенклатуре, то быстрее будет обращаться к реальной таблице и ее данные соединять с номенклатурой из ВТ.
#38 by ViSo76
Вам нужно вместо ВЫБОР ... КОГДА Номенклатура.Ссылка В ИЕРАРХИИ лучше сделать отборы с условием В ИЕРАРХИИ И потом эти оборы ОБЪЕДИНИТЬ ВСЕ я думаю это будет быстрее значительно.
#39 by D_E_S_131
Пока писал коммент по регистру не успел увидеть запрос выборки номенклатуры. Вот где дикая дичь! Построитель плана запроса "сойдет с ума" от такого точно. Все предопределенные папки выносите в массивы и передавайте как параметр, а уже потом только используйте "В ИЕРАРХИИ(&НаборПапок1)", "В ИЕРАРХИИ(&НаборПапок2)"...
#40 by Anabella
Спасибо! Знаю, что топорно, а как грамотно сделать не знала. Попробую по-вашему.
#41 by D_E_S_131
+ к , разнести куски по подзапросам, меняя условия вхождения в иерархию.
#42 by ViSo76
Нахуа так делать? В начале вытащить на клиента, потом отправить на сервер... Всё в одном запросе через виртуальную таблицу, просто запрос написать нормально.
#43 by ViSo76
В запросах у неё всё плохо, но глаза шикарные :)
#44 by D_E_S_131
С чего взял, что что-то передается между кл и серв? Откуда вообще мы знаем, что это все в УП происходит? А время на формирование ВТ, индексирование ее полей учитываешь? И конструкция "В ИЕРАРХИИ(Выбрать ПапкаСсылка ИЗ..)" будет медленнее работать чем "В ИЕРАРХИИ(&ВыбПапки)" — х.з. из-за чего, но экспериментально быстрее получается.
#45 by МихаилМ
бред редкостный. но 25 лет я писал также. у Вас тяжелай форма болезни одинесника: путать получение данных с представлением данных. методически Ваше решение плохое, тк будет требовать постоянной доработки отчета, для добавления удаления групп . замените ваш список  на  бд РС либо справочник. Альтернативное видение иерархий, группировок, фильтров   - это нормальная часть бизнес процессов. но периодически требует секвестирования. в вашем Запросе нужно отказаться от обработки представления в субд. Считать справочник и построить иерархию не клиенте.
#46 by vi0
чувак, тебя читать так же сложно, как в запрос )
#47 by AndreyBarmaley
если справочник небольшой то прокатит... , но я бы через доп. свойство сделал. Всеравно новые папки будут создаваться и придется отчет переделывать.
#48 by D_E_S_131
"если справочник небольшой то прокатит" — из-за подобного подхода было загублено не мало ИБ. Когда "специалист" пишет запрос, все вроде бы быстро работает, а через год у людей "таймауты" начинают "валиться".
#49 by ViSo76
Все предопределенные папки выносите в массивы и передавайте как параметр, а уже потом только используйте "В ИЕРАРХИИ(&НаборПапок1)", "В ИЕРАРХИИ(&НаборПапок2)"... Подразумевается что номенклатуру в начале ты выберешь несколькими запросами на клиента, затем передашь на сервер в качестве параметров и не важно что толстый клиент там тоже виртуальный сервер. А если сервер не виртуальный то сетевые накладки будут выше чем даже запись виртуальной таблицы, если вообще будет запись вместо курсора...
#50 by piter3
+100
#51 by AlexITGround
А что это такое?
#52 by AndreyBarmaley
на ошибках учаться. "красивей" по крайней мере все в одном запросе...
#53 by AndreyBarmaley
учатся
#54 by Anabella
Начала пробовать предложенные варианты. переделала в запрос: "ВЫБРАТЬ                           |    ВТ.ГруппыТоваров, Стало выполняться дольше на 10 секунд( или можно как-то из ГДЕ переместить условие на регистратор?
#55 by D_E_S_131
Соединение ВНУТРЕННЕЕ надо, тебе же строго позии номенклатуры из ВТ нужны. Ну и условие можно в условия связи перенести.
#56 by Anabella
Нет, в ВТ я вытаскиваю только Группы номенклатуры. Саму номенклатуру тяну из ЗаказКлиентов
#57 by ViSo76
Попробуй сделать так:
#58 by D_E_S_131
Вы уже просто "загнались" с этими "Клиентами" и "Серверами". Ну и зря.
#59 by D_E_S_131
#60 by AndreyBarmaley
сделай ВТ из заказов клиентов далее Виртуальная таблица быстрей, регистр не нужен... очень криво
#61 by D_E_S_131
Что именно?
#62 by ViSo76
1. Цикле отбор номенклатур на клиенте, всё это можно сделать и в 1 запросе. 2. ЛЕВОЕ СОЕДИНЕНИЕ вместо: ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей 3. И почему ты уверен что нужно отбрасывать некоторые позиции заказ если они не входят в эти группы?
#63 by AlexSmirnov272
избавьтесь от условия ГДЕ, Вам писали уже)
#64 by D_E_S_131
Возьми консоль запросов с инструментом замера времени выполнения запроса и посмотри сколько займет время сделать "одним запросом" и "передать как параметр". Совсем недавно делал нечто подобное и был удивлен, что условие "В" компилятор запроса формирует не так как "В (Выбрать...)". И раза в 3 быстрее сделал (но тут от кол-ва данных будет зависеть ускорение).
#65 by Anabella
Ничего себе... пошла пробовать.
#66 by ViSo76
Ты чушь пишешь. Я не предлагал писать В ( ВЫБРАТЬ ... ИЗ ). Если у тебя понимания не хватает я тебе его рихтовать не буду. И я понимаю что "один запрос" это всего лишь один текст, но возможно несколько запросов к базе.
#67 by D_E_S_131
+ к При чем "построитель плана запроса" с третьего или четвертого раза вывел "В (Выбрать...)" на скорость выполнения такую как у "В(&Парам)". Проделывалось на MS SQL 2008 R2.
#68 by D_E_S_131
А ты не кипятись и просто свой вариант покажи. А уж я не поленюсь и прогоню его через замер скорости выполнения и профайлер.
#69 by AndreyBarmaley
Время запросов в цикле учитывал?
#70 by Anabella
Господа, хорош спорить. У меня еще другой запрос к той же ВТ обращается, но тормозит именно тот который ЗаказКлиента
#71 by Anabella
Номенклатуру-то я конечно переделаю по группам товаров чтоб грамотно-красиво, но проблема не в ней.
#72 by vi0
нехороший совет будет только хуже
#73 by Anabella
на секунду дольше выполняется
#74 by vi0
Для каждого ТекСтр Из ГруппыПосуда Цикл     СпрСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ТекСтр); ... это называется запрос в цикле
#75 by D_E_S_131
Когда свой случай решал — да. Найти десяток элементов по индексированному полю это было быстрее даже чем получить эти же элементы одним запросом и поместить их в ВТ. При чем исходил из того, что передавая массив в условие "В", система так же сформирует временную таблицу в tempdb и будет выборкой в ней проверять условия. Оказалось, что ничего подобного.
#76 by D_E_S_131
А как долго у тебя выполняется просто выборка записей РН с условием по &Регистратор? Для нескольких элементов это оправдывается выигрышем в скорости выполнения в дальнейшем (в моем случае было всего 5 таких папок).
#77 by AndreyBarmaley
ок... может быть    пробовала?
#78 by ViSo76
Сравнивай
#79 by ViSo76
Код не проверял, не знаю что за конфа если что подправишь огрехи
#80 by ViSo76
Да подмени не заметил
#81 by AndreyBarmaley
покажи весь запрос с документами оплаты УТ11?
#82 by Anabella
да. Я сейчас как раз втыкаю смысл в . У вас там обращение к ВТ, в которой и номенклатура и заказ клиента. У меня в ВТ исключительно номенклатура, запрос к справочнику номенклатуры. Предлагаете создать ВТ с заказами и соединить её с запросом в котором заказы? Зачем? Я соединяю, чтобы отдельно разбивались по группам и не портило основной запрос. А зачем запрос с заказами соединять с ВТ с запросом с заказами как-то не улавливаю.
#83 by AndreyBarmaley
Я бы в справочник номенклатура лез после того как определил какие именно заказы оплатили...
#84 by Anabella
Думала-думала, решила лучше спросить. Технически как это сделать?) сначала один запрос, потом второй, или как ?)
#85 by D_E_S_131
Ну и вот результат: 1. Твой изначальный вариант — первый запуск 852 мс, далее 440 мс. 2. Изменяю твой вариант и вместо поиска по наименованию "подсовываю" сразу массив с папками — результат колеблется около 330 мс. 3. Не использую ВТ вообще и сразу двумя подзапросами выбираю номенклатуру по переданным группам — результат 250-260 мс. Тут даже особо другого результата и не ожидалось. При большой выборке данных зачастую не дооценивают время формирования всех этих ВТ. Более того, выбирая элементы справочника в ВТ, на них накладывается оптимистическая блокировка и пока моя ВТ что-то там тянет из записей РН, никто не сможет что-то записать в справочник номенклатуры. Выбирая же просто папки и сравнивая с папками я никаким образом не блокирую обычные элементы справочника.
#86 by AndreyBarmaley
какая конфигурация?
#87 by vi0
> выбирая элементы справочника в ВТ, на них накладывается оптимистическая блокировка блокировка накладывается если читаешь в транзакции
#88 by D_E_S_131
Разницу между пессимистичной и оптимистичной блокировкой ощущаешь?
#89 by Anabella
УТ 11
#90 by vi0
и к чему вопрос? там не будет блокировки
#91 by Anabella
Вот спасибо, буду знать!
#92 by Fragster
в фигня, есличо
#93 by D_E_S_131
Консоль запросов врет?
#94 by H A D G E H O G s
У тебя похоже, особая консоль
#95 by D_E_S_131
Хочешь сказать, что если мы читаем данные из Спр.Номенклатура, помещаем их в ВТ, потом используем эту ВТ дальше, то кто-то в это время может удалить один или несколько элементов Спр.Номенклатура?
#96 by D_E_S_131
Возможно. Но пока с "тормозами" в базе успешно помогала справляться.
#97 by H A D G E H O G s
Читаем вне транзакции - да. Читаем в транзакции - по разному.
#98 by vi0
честно скажу, именно удалить не пробовал ты выше пишешь не про удаление, а про изменение нормальная схема, когда удалением занимается администратор, а не так запросто в течение работы пользователей
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С