Почему тормозит запрос

1. Ann.prog1C 08.03.17 23:55 Сейчас в теме
Пытаюсь оптимизировать код. Самым тяжелым при проведении оказался этот запрос (контроль свободного остатка на складе):
Запрос.Текст =    "ВЫБРАТЬ
           |	РеализацияТоваровУслугТовары.Ссылка.Склад,
           |	РеализацияТоваровУслугТовары.Номенклатура,
	   |	СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Коэффициент) КАК Необходимо,
	   |	СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток) КАК ВРезерве,
           |	СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК НаСкладе
           |ИЗ
           |	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
           |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(
           |				&ДатаДок,
           |				Склад = &Склад
           |					И Организация = &Организация) КАК ТоварыВРезервеНаСкладахОстатки
           |		ПО РеализацияТоваровУслугТовары.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
           |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
           |				&ДатаДок,
           |				Склад = &Склад
           |					И Организация = &Организация) КАК ТоварыНаСкладахОстатки
           |		ПО РеализацияТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
           |ГДЕ
           |	РеализацияТоваровУслугТовары.Ссылка = &Ссылка
           |
           |СГРУППИРОВАТЬ ПО
           |	РеализацияТоваровУслугТовары.Номенклатура,
           |	РеализацияТоваровУслугТовары.Ссылка.Склад,
           |	РеализацияТоваровУслугТовары.НомерСтроки
           |
           |ДЛЯ ИЗМЕНЕНИЯ";

Показать

Что здесь не так? Возможно из за блокировки для изменения?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. ditp 91 10.03.17 10:09 Сейчас в теме
(1) попробуйте
ВЫБРАТЬ
	РеализацияТоваровУслугТовары.Номенклатура,
	СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Коэффициент) КАК Необходимо,
	РеализацияТоваровУслугТовары.НомерСтроки
ПОМЕСТИТЬ тТовары
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
	РеализацияТоваровУслугТовары.Ссылка = &Ссылка

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

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

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

УПОРЯДОЧИТЬ ПО
	НомерСтроки
Показать
Ann.prog1C; +1 Ответить
9. KazanKokos 10 10.03.17 10:14 Сейчас в теме
(7) вроде ускорить должно просто
 Левое соединение (Выбрать только нужные колонки.....) КАК 

У меня с ценами так было. С одним видом цен не тормозило сильно. А когда подцеплял еще раз регистр цен для другого вида цен то все тормозило. Сделал предварительный отбор только нужных колонок и полетело.
10. kolya_tlt 86 10.03.17 10:17 Сейчас в теме
(9) в поисках оптимизации производительности нельзя тупо перебирать все ранее примененные методы "потому что в прошлый раз помогло"
11. KazanKokos 10 10.03.17 10:19 Сейчас в теме
Напишите ваше сообщение
(10) ну здесь она же выбирает все колонки. А если выбирать только то что нужно(в данном случае сумму остатка по отбору) то должно помочь. имхо логично. Вон в (7) в итоге тоже самое делает что автор темы только через ВТ
8. kolya_tlt 86 10.03.17 10:13 Сейчас в теме
(1) странно что в РН Товары имеется организация.
(0) вам нужно передать максимальное количество полей (включая характеристику) в параметры виртуальной таблицы. ну а самое тяжелое в этом запросе 2 соединения, которые можно преобразовать в одно заменив их объединением
2. Vovan58 65 09.03.17 00:53 Сейчас в теме
Сначала временная таблица - выборка товаров из ТЧ,
за тем временные таблицы из Виртуальных с фильтрацией по Товарам из ТЧ
за тем - соединения. Обычно так делаю, так и на экзамене Спеца по платформе Гончаров требовал :)
PhoenixAOD; Ann.prog1C; +2 Ответить
3. user667308_icscloud 10.03.17 07:23 Сейчас в теме
(2) Плюс индексация временных таблиц
Vovan58; Ann.prog1C; +2 Ответить
13. Ann.prog1C 10.03.17 12:48 Сейчас в теме
Спасибо всем огромнейшее за обсуждение. Удалось сдвинуть этот запрос с почетного первого на четвертое место. Объективно на сколько ускорилось сказать не могу - на разных выборках тестировала.
Учла (2) и (3). и частично (12). Получилось так:
        "ВЫБРАТЬ
		                |	РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
		                |	СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Коэффициент) КАК Необходимо
		                |ПОМЕСТИТЬ РН
		                |ИЗ
		                |	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
		                |ГДЕ
		                |	РеализацияТоваровУслугТовары.Ссылка = &Ссылка
		                |
		                |СГРУППИРОВАТЬ ПО
		                |	РеализацияТоваровУслугТовары.Номенклатура,
		                |	РеализацияТоваровУслугТовары.НомерСтроки
		                |
		                |ИНДЕКСИРОВАТЬ ПО
		                |	Номенклатура
		                |;
		                |
		                |////////////////////////////////////////////////////////////­////////////////////
		                |ВЫБРАТЬ
		                |	ТоварыВРезервеНаСкладахОстатки.Номенклатура КАК Номенклатура,
		                |	СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток) КАК ВРезерве
		                |ПОМЕСТИТЬ Зарезервировано
		                |ИЗ
		                |	РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(
		                |			&ДатаДок,
		                |			Склад = &Склад
		                |				И Организация = &Организация
		                |				И Номенклатура В
		                |					(ВЫБРАТЬ
		                |						РН.Номенклатура
		                |					ИЗ
		                |						РН КАК РН)) КАК ТоварыВРезервеНаСкладахОстатки
		                |
		                |СГРУППИРОВАТЬ ПО
		                |	ТоварыВРезервеНаСкладахОстатки.Номенклатура
		                |
		                |ИНДЕКСИРОВАТЬ ПО
		                |	Номенклатура
		                |;
		                |
		                |////////////////////////////////////////////////////////////­////////////////////
		                |ВЫБРАТЬ
		                |	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
		                |	СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК НаСкладе
		                |ПОМЕСТИТЬ ТоварыНаСкладе
		                |ИЗ
		                |	РегистрНакопления.ТоварыНаСкладах.Остатки(
		                |			&ДатаДок,
		                |			Склад = &Склад
		                |				И Организация = &Организация
		                |				И Номенклатура В
		                |					(ВЫБРАТЬ
		                |						РН.Номенклатура
		                |					ИЗ
		                |						РН КАК РН)) КАК ТоварыНаСкладахОстатки
		                |
		                |СГРУППИРОВАТЬ ПО
		                |	ТоварыНаСкладахОстатки.Склад,
		                |	ТоварыНаСкладахОстатки.Номенклатура
		                |
		                |ИНДЕКСИРОВАТЬ ПО
		                |	Номенклатура
		                |;
		                |
		                |////////////////////////////////////////////////////////////­////////////////////
		                |ВЫБРАТЬ
		                |	РН.Номенклатура,
		                |	РН.Необходимо КАК Необходимо,
		                |	Зарезервировано.ВРезерве КАК ВРезерве,
		                |	ТоварыНаСкладе.НаСкладе КАК НаСкладе
		                |ИЗ
		                |	РН КАК РН
		                |		ЛЕВОЕ СОЕДИНЕНИЕ Зарезервировано КАК Зарезервировано
		                |		ПО РН.Номенклатура = Зарезервировано.Номенклатура
		                |		ЛЕВОЕ СОЕДИНЕНИЕ ТоварыНаСкладе КАК ТоварыНаСкладе
		                |		ПО РН.Номенклатура = ТоварыНаСкладе.Номенклатура
		                |
		                |ДЛЯ ИЗМЕНЕНИЯ";			
Показать



(12), режим управления блокировками НЕ автоматический. Наверное действительно стоит задуматься над изменением технологии контроля остатков.

Всем огромнейшее спасибо за советы и обсуждение.
14. nickpugachev 10.03.17 19:01 Сейчас в теме
(13)
Наверное действительно стоит задуматься над изменением технологии контроля остатков

В случае управляемых блокировок у вас не действует ДЛЯ ИЗМЕНЕНИЯ в запросе. Блокировки не будет. Поэтому при такой схеме контроля остатков вам нужно ОБЯЗАТЕЛЬНО ставить управляемую блокировку на регистры накопления руками. В противном случае вы можете уйти в минус даже с этим контролем остатков.
4. qwer107 10.03.17 08:18 Сейчас в теме
|ДЛЯ ИЗМЕНЕНИЯ"; тормозит. Еще пару выразить Выразить (РеализацияТоваровУслугТовары.Ссылка.Склад как Справочник.Склады) в запрос добавить, но т.к это один документ то тормозит для изменения.
5. YanSergey 145 10.03.17 08:36 Сейчас в теме
(4)Что вы ерунду пишете. "ДЛЯ ИЗМЕНЕНИЯ" не может тормозить. Это флаг, накладывающий блокировку обновления.

(2)Владимир прав. Нельзя соединять реальные таблицы с виртуальными, а так же виртуальные с виртуальными. Нужно все помещать во временные таблицы.
"ДЛЯ ИЗМЕНЕНИЯ" также нужно доработать.
Нужно указывать только те таблицы, по которым в последующем будут делаться движения - что бы блокировались только они.
6. shnurov 10.03.17 10:06 Сейчас в теме
Скорее всего тормозят регистры, попробуйте загнать данные ТЧ документа в временную таблицу, а в отборе для регистров добавьте

номенклатура в (выбрать ВТЗ.номенклатура из ВТЗ сгруппировать по ВТЗ.Номенклатура), т.е. выберете только записи по нужной номенклатуре, а так он остатки по всей номенклатуре получает, а потом левое делает что долго.
12. nickpugachev 10.03.17 12:08 Сейчас в теме
1. Режим управления блокировкой данных - точно автоматический? Если да, то продолжаем, если нет - то зачем используется контроль остатков в таком виде? пишите движения и потом проверяйте остатки по регистрам, быстрее будет
2. Если режим управления блокировкой автоматический, то вам нужен обязательно отбор по номенклатуре в остатках регистров накопления, иначе вы установите излишнюю блокировку, которая может привести к ожиданиям либо у проводимого документа либо у тех кто будет что-то делать с регистром по тем же организации и складу
3. В зависимости от ожидаемого количества позиций в реализации - остатки во временные таблицы и соединяться уже с ними.
Ann.prog1C; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот