Ускорение вывода результата отчета СКД

1. Bajo 81 28.12.13 10:33 Сейчас в теме
Есть отчет План-факт по брендам. группировка по строка: контрагенты. группировка по колонкам брендам. Ресурсы: план на месяц, план на дату, факт на дату, процент на дату. В виду того что данных слишком много. На некоторых компах отчет доходит до определенного процента вывода и зависает. На мощных выполняется, но тоже долго. Вначале даже у меня писал "Недостаточно памяти на сервере". Но после отключения расшифровки стал формироваться. Сервер очень мощный. Как еще можно оптимизировать этот отчет?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. AllexSoft 28.12.13 10:50 Сейчас в теме
(1) Bajo, смотреть запрос в первую очередь... так что давай запрос сюда ну или отчет целиком
3. oldfornit 28.12.13 11:40 Сейчас в теме
Еще один ньюанс - если это внешний отчет, то наверняка все запросы выполняются на стороне клиента.

Получение набора данных можно сделать в общем модуле в контекста сервера, а в СКД отдавать таблицы значений.
4. AllexSoft 28.12.13 12:26 Сейчас в теме
Еще один ньюанс - если это внешний отчет, то наверняка все запросы выполняются на стороне клиента.

на стороне клиента не может ничего выполняться в части запросов в 8.2 априори. Так что хоть внешний хоть внутренний все равно
5. Bajo 81 28.12.13 12:52 Сейчас в теме
Конфигурация древняя УТ 10.2. Отчет внешний,но находится на файловом сервере.

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

СГРУППИРОВАТЬ ПО
	Контрагенты.Категория,
	ПланФакт.Клиент,
	ПланФакт.Бренд,
	ПланФакт.ТорговыйПредставитель,
	Контрагенты.Организация,
	Контрагенты.Контрагент[1C-CODE]
Показать
[/1C-CODE]
6. oldfornit 13.01.14 12:05 Сейчас в теме
(5) Bajo, о, самый первый шаг для оптимизации - заменить вложенные запросы на временные таблицы с индексированием.
Второй шаг - переписать поиск родителей брендов. Наверняка можно не искать Бренд.Родитель.Родитель.Родитель.Родитель и т.п., а использовать отдельную временную таблицу, в которой можно получить перечень брендов В Иерархии.
7. vetaldober 18 13.01.14 16:01 Сейчас в теме
Убери вложенные запросы. Вместо них временные таблицы делай. сразу в разы увеличится скорость.
8. Bukaska 147 13.01.14 16:02 Сейчас в теме
(7) vetaldober, Угу.. раз эдак в 10)))
9. vanleo 13.01.14 16:13 Сейчас в теме
+ 5 копеек: трансформируй выводимые пользователю ссылки на представление через Представление() или [Ссылка].Наименование. Иначе программа сама будет делать неявный вызов для получения основного представления.
Основное написали:
- вложенные запросы менять на врем таблицы (с индексированием),
- использовать параметры вирт таблиц,
- не использовать в запросе функции от параметров (типа КОНЕЦПЕРИОДА(&Дата2,МЕСЯЦ)
- ограничить получение поля "Ссылка" чреез точку
- использать ВЫРАЗИТЬ при работе с данных составного типа
voneska7; +1 Ответить
12. voneska7 05.12.23 11:42 Сейчас в теме
(9) Столкнулся с проблемой при оптимизации отчета СКД, помогли данные советы. Но есть еще один самый эффективный способ, это убрать расшифровку и ресурсов, именно это спасло ситуацию у меня. Совет нашел также на сайте [URL=https://infostart.ru/1c/articles/73879/] спасибо vanleo и Danil Potapov
10. Vovan58 64 13.01.14 21:10 Сейчас в теме
присоединяюсь. Есть еще идеи -
 ВЫБОР
                        КОГДА ПродажиОбороты.Номенклатура.Бренд.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Бренд.ПустаяСсылка)
                            ТОГДА 4
                        КОГДА ПродажиОбороты.Номенклатура.Бренд.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Бренд.ПустаяСсылка)
                            ТОГДА 5
                    КОНЕЦ КАК УрБренд,

переделать - понятно что считается уровень вложенности, но желательно уйти от этого кода

А что, обороты по факту интересуют за все время? Раз нет -то и указать в параметрах виртуальной таблицы период начала и окончания.

И есть еще технологический журнал - посмотреть план запроса.
11. Bajo 81 18.02.14 15:22 Сейчас в теме
(10) Vovan58, это запрос СКД. Параметры виртуальной таблицы автоматически появляются как параметр. Действительно сделал немного другой отчет с использованием временных таблиц. Скорость выполнения запроса повысилась в 100 раз. Спасибо
13. Salavat 15 05.12.23 15:14 Сейчас в теме
(11)
Вложенные запросы - это тема, которую я ненавижу, ещё/уже со времён 8.0.
Результаты этой вложенности - даже проверить - невозможно в принципе.
А "упрощение" (якобы короче текст!) текста запроса - далеко не всегда Факт!

Временные таблицы - это именно то, что нужно для запроса.
В языке SQL - они во всех (знакомых мне!) СУБД и используются.

Индексирование временных таблиц - да.
Но - там тоже не всё (и всегда!) однозначно.
Кроме одного бесспорного - индексирование (правильное и при больших объёмах данных!) реально ускоряет получение нужных данных.
Оставьте свое сообщение

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