УТ 11. Ускорить получение границ регистра.

1. unknown181538 158 04.11.20 04:19 Сейчас в теме
При проведении документа РТиУ много времени занимает вызов процедуры из общего модуля.


//Возвращает структуру границ оборотов по регистру
//
// Параметры:
// ИмяРегистра - Строка - Имя регистра накопления.
// Отборы - Строка - Отборы виртуальной таблицы оборотов, для которой необходимо получить границы.
// Параметры - Структура - Параметры запроса для отборов виртуальной таблицы.
//
// Возвращаемое значение:
// Структура - Структура границ со свойствами:
// * МинимальнаяДата - Дата - Начальная граница оборотов.
// * МаксимальнаяДата - Дата - Конечная граница оборотов.
//
Функция ГраницыОборотовРегистра(ИмяРегистра, Отборы, Параметры) Экспорт

Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПсевдонимТаблицы.Период КАК Период
|ИЗ
| РегистрНакопления." + ИмяРегистра + ".Обороты(, , Запись, " + Отборы + ") КАК ПсевдонимТаблицы
|
|УПОРЯДОЧИТЬ ПО
| Период;
|ВЫБРАТЬ ПЕРВЫЕ 1
| ПсевдонимТаблицы.Период КАК Период
|ИЗ
| РегистрНакопления." + ИмяРегистра + ".Обороты(, , Запись, " + Отборы + ") КАК ПсевдонимТаблицы
|
|УПОРЯДОЧИТЬ ПО
| Период УБЫВ");

Для каждого Параметр из Параметры Цикл
Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
КонецЦикла;

Результат = Запрос.ВыполнитьПакет();
СтруктураГраниц = Новый Структура;
СтруктураГраниц.Вставить("МинимальнаяДата", ?(Результат[0].Пустой(), Дата(1,1,1), Результат[0].Выгрузить()[0].Период));
СтруктураГраниц.Вставить("МаксимальнаяДата", ?(Результат[1].Пустой(), Дата(2999,1,1), Результат[1].Выгрузить()[0].Период));

Возврат СтруктураГраниц;

КонецФункции

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

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

УПОРЯДОЧИТЬ ПО
Период УБЫВ


Какие есть идеи по ускорении запроса?
Кажется, очевидным замена двух запросов одним сгруппированным. Но думаю, что запрос с периодичность Запись все равно будет долго выполняться.
ЗаказКлиента индексированное измерение.
Найденные решения
2. unknown181538 158 04.11.20 05:07 Сейчас в теме
Мой вариант:
Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	МАКСИМУМ(ПсевдонимТаблицы.Период) КАК МаксПериод,
		|	МИНИМУМ(ПсевдонимТаблицы.Период) КАК МинПериод
		|ИЗ
		|	РегистрНакопления." + ИмяРегистра + ".Обороты(, , Секунда, " + Отборы + ") КАК ПсевдонимТаблицы";
		
	Для каждого Параметр из Параметры Цикл
		Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
	КонецЦикла;
		
	Результат = Запрос.Выполнить();
	
	Выборка = Результат.Выбрать();
	
	СтруктураГраниц = Новый Структура;
	Если Выборка.Следующий() Тогда
		СтруктураГраниц.Вставить("МинимальнаяДата", Выборка.МинПериод);
		СтруктураГраниц.Вставить("МаксимальнаяДата", Выборка.МаксПериод);
	Иначе
		СтруктураГраниц.Вставить("МинимальнаяДата", Дата(1,1,1));
		СтруктураГраниц.Вставить("МаксимальнаяДата", Дата(2999,1,1));
	КонецЕсли;
	Возврат СтруктураГраниц;
Показать




Замена периодичность "Запись" на "Секунда" дала хороший результат.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. unknown181538 158 04.11.20 05:07 Сейчас в теме
Мой вариант:
Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	МАКСИМУМ(ПсевдонимТаблицы.Период) КАК МаксПериод,
		|	МИНИМУМ(ПсевдонимТаблицы.Период) КАК МинПериод
		|ИЗ
		|	РегистрНакопления." + ИмяРегистра + ".Обороты(, , Секунда, " + Отборы + ") КАК ПсевдонимТаблицы";
		
	Для каждого Параметр из Параметры Цикл
		Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
	КонецЦикла;
		
	Результат = Запрос.Выполнить();
	
	Выборка = Результат.Выбрать();
	
	СтруктураГраниц = Новый Структура;
	Если Выборка.Следующий() Тогда
		СтруктураГраниц.Вставить("МинимальнаяДата", Выборка.МинПериод);
		СтруктураГраниц.Вставить("МаксимальнаяДата", Выборка.МаксПериод);
	Иначе
		СтруктураГраниц.Вставить("МинимальнаяДата", Дата(1,1,1));
		СтруктураГраниц.Вставить("МаксимальнаяДата", Дата(2999,1,1));
	КонецЕсли;
	Возврат СтруктураГраниц;
Показать




Замена периодичность "Запись" на "Секунда" дала хороший результат.
3. tetraren 35 04.11.20 11:17 Сейчас в теме
У вас детализация до записи, вам .Обороты() не нужен, делайте просто по РегистрНакопления.ИмяРегистра, это будет быстрее.

И проверьте, чтобы у ваших измерений, которые в отборе и которые высокоселективные, стояло Индексировать (если это не первое измерение.
unknown181538; +1 Ответить
4. unknown181538 158 04.11.20 12:28 Сейчас в теме
(3)
обы у ваших измерений, которые в отборе и которые высокоселективные, стояло Индексировать (если это не первое и

А ведь точно. Сделаю замеры. Посмотрю, где эта процедура вызывается, и исходя из этого сделаю замену на вызов процедуры без вирт. таблиц.
5. unknown181538 158 05.11.20 19:44 Сейчас в теме
(3) Попробовал
Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	МАКСИМУМ(ПсевдонимТаблицы.Период) КАК МаксПериод,
		|	МИНИМУМ(ПсевдонимТаблицы.Период) КАК МинПериод
		|ИЗ
		|	РегистрНакопления." + ИмяРегистра + " КАК ПсевдонимТаблицы
		|ГДЕ ПсевдонимТаблицы."+Отборы + " ";
		
	Для каждого Параметр из Параметры Цикл
		Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
	КонецЦикла;
		
	Результат = Запрос.Выполнить();
	
	Выборка = Результат.Выбрать();
	
	СтруктураГраниц = Новый Структура;
	Если Выборка.Следующий() Тогда
		СтруктураГраниц.Вставить("МинимальнаяДата", ?(Выборка.МинПериод=Null,Дата(1,1,1),Выборка.МинПериод));
		СтруктураГраниц.Вставить("МаксимальнаяДата", ?(Выборка.МаксПериод=Null,Дата(2999,1,1),Выборка.МаксПериод));
	Иначе
		СтруктураГраниц.Вставить("МинимальнаяДата", Дата(1,1,1));
		СтруктураГраниц.Вставить("МаксимальнаяДата", Дата(2999,1,1));
	КонецЕсли;
	Возврат СтруктураГраниц;
Показать


Оказалось медленнее, чем мой вариант.
6. tetraren 35 06.11.20 07:44 Сейчас в теме
(5) А если так
"
|ВЫБРАТЬ МИНИМАМ(Период) КАК МинПериод, МАКСИМУМ(Период) МаксПериод
|ИЗ (
|	ВЫБРАТЬ
|		МАКСИМУМ(Период) КАК Период,
|	ИЗ
|		РегистрНакопления." + ИмяРегистра + " КАК ПсевдонимТаблицы
|	ГДЕ ПсевдонимТаблицы."+Отборы + " "
|	ОБЪЕДИНИТЬ ВСЕ
|	ВЫБРАТЬ
|		МИНИМУМ(Период) КАК Период
|	ИЗ
|		РегистрНакопления." + ИмяРегистра + " КАК ПсевдонимТаблицы
|	ГДЕ ПсевдонимТаблицы."+Отборы + " "
|) КАК Границы
|"
Показать


Если не катит, значит проблема с отборами.
7. tetraren 35 06.11.20 08:18 Сейчас в теме
Оставьте свое сообщение

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