УТ 11. Ускорить получение границ регистра.
При проведении документа РТиУ много времени занимает вызов процедуры из общего модуля.
//Возвращает структуру границ оборотов по регистру
//
// Параметры:
// ИмяРегистра - Строка - Имя регистра накопления.
// Отборы - Строка - Отборы виртуальной таблицы оборотов, для которой необходимо получить границы.
// Параметры - Структура - Параметры запроса для отборов виртуальной таблицы.
//
// Возвращаемое значение:
// Структура - Структура границ со свойствами:
// * МинимальнаяДата - Дата - Начальная граница оборотов.
// * МаксимальнаяДата - Дата - Конечная граница оборотов.
//
Функция ГраницыОборотовРегистра(ИмяРегистра, Отборы, Параметры) Экспорт
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПсевдонимТаблицы.Период КАК Период
|ИЗ
| РегистрНакопления." + ИмяРегистра + ".Обороты(, , Запись, " + Отборы + ") КАК ПсевдонимТаблицы
|
|УПОРЯДОЧИТЬ ПО
| Период;
|ВЫБРАТЬ ПЕРВЫЕ 1
| ПсевдонимТаблицы.Период КАК Период
|ИЗ
| РегистрНакопления." + ИмяРегистра + ".Обороты(, , Запись, " + Отборы + ") КАК ПсевдонимТаблицы
|
|УПОРЯДОЧИТЬ ПО
| Период УБЫВ");
Для каждого Параметр из Параметры Цикл
Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
Результат = Запрос.ВыполнитьПакет();
СтруктураГраниц = Новый Структура;
СтруктураГраниц.Вставить("МинимальнаяДата", ?(Результат[0].Пустой(), Дата(1,1,1), Результат[0].Выгрузить()[0].Период));
СтруктураГраниц.Вставить("МаксимальнаяДата", ?(Результат[1].Пустой(), Дата(2999,1,1), Результат[1].Выгрузить()[0].Период));
Возврат СтруктураГраниц;
КонецФункции
в конкретном случае текст запроса:
ВЫБРАТЬ ПЕРВЫЕ 1
ПсевдонимТаблицы.Период КАК Период
ИЗ
РегистрНакопления.ЗаказыКлиентов.Обороты(, , Запись, ЗаказКлиента В (&МассивЗаказов)) КАК ПсевдонимТаблицы
УПОРЯДОЧИТЬ ПО
Период;
ВЫБРАТЬ ПЕРВЫЕ 1
ПсевдонимТаблицы.Период КАК Период
ИЗ
РегистрНакопления.ЗаказыКлиентов.Обороты(, , Запись, ЗаказКлиента В (&МассивЗаказов)) КАК ПсевдонимТаблицы
УПОРЯДОЧИТЬ ПО
Период УБЫВ
Какие есть идеи по ускорении запроса?
Кажется, очевидным замена двух запросов одним сгруппированным. Но думаю, что запрос с периодичность Запись все равно будет долго выполняться.
ЗаказКлиента индексированное измерение.
//Возвращает структуру границ оборотов по регистру
//
// Параметры:
// ИмяРегистра - Строка - Имя регистра накопления.
// Отборы - Строка - Отборы виртуальной таблицы оборотов, для которой необходимо получить границы.
// Параметры - Структура - Параметры запроса для отборов виртуальной таблицы.
//
// Возвращаемое значение:
// Структура - Структура границ со свойствами:
// * МинимальнаяДата - Дата - Начальная граница оборотов.
// * МаксимальнаяДата - Дата - Конечная граница оборотов.
//
Функция ГраницыОборотовРегистра(ИмяРегистра, Отборы, Параметры) Экспорт
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПсевдонимТаблицы.Период КАК Период
|ИЗ
| РегистрНакопления." + ИмяРегистра + ".Обороты(, , Запись, " + Отборы + ") КАК ПсевдонимТаблицы
|
|УПОРЯДОЧИТЬ ПО
| Период;
|ВЫБРАТЬ ПЕРВЫЕ 1
| ПсевдонимТаблицы.Период КАК Период
|ИЗ
| РегистрНакопления." + ИмяРегистра + ".Обороты(, , Запись, " + Отборы + ") КАК ПсевдонимТаблицы
|
|УПОРЯДОЧИТЬ ПО
| Период УБЫВ");
Для каждого Параметр из Параметры Цикл
Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
Результат = Запрос.ВыполнитьПакет();
СтруктураГраниц = Новый Структура;
СтруктураГраниц.Вставить("МинимальнаяДата", ?(Результат[0].Пустой(), Дата(1,1,1), Результат[0].Выгрузить()[0].Период));
СтруктураГраниц.Вставить("МаксимальнаяДата", ?(Результат[1].Пустой(), Дата(2999,1,1), Результат[1].Выгрузить()[0].Период));
Возврат СтруктураГраниц;
КонецФункции
в конкретном случае текст запроса:
ВЫБРАТЬ ПЕРВЫЕ 1
ПсевдонимТаблицы.Период КАК Период
ИЗ
РегистрНакопления.ЗаказыКлиентов.Обороты(, , Запись, ЗаказКлиента В (&МассивЗаказов)) КАК ПсевдонимТаблицы
УПОРЯДОЧИТЬ ПО
Период;
ВЫБРАТЬ ПЕРВЫЕ 1
ПсевдонимТаблицы.Период КАК Период
ИЗ
РегистрНакопления.ЗаказыКлиентов.Обороты(, , Запись, ЗаказКлиента В (&МассивЗаказов)) КАК ПсевдонимТаблицы
УПОРЯДОЧИТЬ ПО
Период УБЫВ
Какие есть идеи по ускорении запроса?
Кажется, очевидным замена двух запросов одним сгруппированным. Но думаю, что запрос с периодичность Запись все равно будет долго выполняться.
ЗаказКлиента индексированное измерение.
Найденные решения
Мой вариант:
Замена периодичность "Запись" на "Секунда" дала хороший результат.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(ПсевдонимТаблицы.Период) КАК МаксПериод,
| МИНИМУМ(ПсевдонимТаблицы.Период) КАК МинПериод
|ИЗ
| РегистрНакопления." + ИмяРегистра + ".Обороты(, , Секунда, " + Отборы + ") КАК ПсевдонимТаблицы";
Для каждого Параметр из Параметры Цикл
Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
СтруктураГраниц = Новый Структура;
Если Выборка.Следующий() Тогда
СтруктураГраниц.Вставить("МинимальнаяДата", Выборка.МинПериод);
СтруктураГраниц.Вставить("МаксимальнаяДата", Выборка.МаксПериод);
Иначе
СтруктураГраниц.Вставить("МинимальнаяДата", Дата(1,1,1));
СтруктураГраниц.Вставить("МаксимальнаяДата", Дата(2999,1,1));
КонецЕсли;
Возврат СтруктураГраниц;
ПоказатьЗамена периодичность "Запись" на "Секунда" дала хороший результат.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Мой вариант:
Замена периодичность "Запись" на "Секунда" дала хороший результат.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(ПсевдонимТаблицы.Период) КАК МаксПериод,
| МИНИМУМ(ПсевдонимТаблицы.Период) КАК МинПериод
|ИЗ
| РегистрНакопления." + ИмяРегистра + ".Обороты(, , Секунда, " + Отборы + ") КАК ПсевдонимТаблицы";
Для каждого Параметр из Параметры Цикл
Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
СтруктураГраниц = Новый Структура;
Если Выборка.Следующий() Тогда
СтруктураГраниц.Вставить("МинимальнаяДата", Выборка.МинПериод);
СтруктураГраниц.Вставить("МаксимальнаяДата", Выборка.МаксПериод);
Иначе
СтруктураГраниц.Вставить("МинимальнаяДата", Дата(1,1,1));
СтруктураГраниц.Вставить("МаксимальнаяДата", Дата(2999,1,1));
КонецЕсли;
Возврат СтруктураГраниц;
ПоказатьЗамена периодичность "Запись" на "Секунда" дала хороший результат.
У вас детализация до записи, вам .Обороты() не нужен, делайте просто по РегистрНакопления.ИмяРегистра, это будет быстрее.
И проверьте, чтобы у ваших измерений, которые в отборе и которые высокоселективные, стояло Индексировать (если это не первое измерение.
И проверьте, чтобы у ваших измерений, которые в отборе и которые высокоселективные, стояло Индексировать (если это не первое измерение.
(3) Попробовал
Оказалось медленнее, чем мой вариант.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(ПсевдонимТаблицы.Период) КАК МаксПериод,
| МИНИМУМ(ПсевдонимТаблицы.Период) КАК МинПериод
|ИЗ
| РегистрНакопления." + ИмяРегистра + " КАК ПсевдонимТаблицы
|ГДЕ ПсевдонимТаблицы."+Отборы + " ";
Для каждого Параметр из Параметры Цикл
Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
СтруктураГраниц = Новый Структура;
Если Выборка.Следующий() Тогда
СтруктураГраниц.Вставить("МинимальнаяДата", ?(Выборка.МинПериод=Null,Дата(1,1,1),Выборка.МинПериод));
СтруктураГраниц.Вставить("МаксимальнаяДата", ?(Выборка.МаксПериод=Null,Дата(2999,1,1),Выборка.МаксПериод));
Иначе
СтруктураГраниц.Вставить("МинимальнаяДата", Дата(1,1,1));
СтруктураГраниц.Вставить("МаксимальнаяДата", Дата(2999,1,1));
КонецЕсли;
Возврат СтруктураГраниц;
ПоказатьОказалось медленнее, чем мой вариант.
(5) А если так
Если не катит, значит проблема с отборами.
"
|ВЫБРАТЬ МИНИМАМ(Период) КАК МинПериод, МАКСИМУМ(Период) МаксПериод
|ИЗ (
| ВЫБРАТЬ
| МАКСИМУМ(Период) КАК Период,
| ИЗ
| РегистрНакопления." + ИмяРегистра + " КАК ПсевдонимТаблицы
| ГДЕ ПсевдонимТаблицы."+Отборы + " "
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| МИНИМУМ(Период) КАК Период
| ИЗ
| РегистрНакопления." + ИмяРегистра + " КАК ПсевдонимТаблицы
| ГДЕ ПсевдонимТаблицы."+Отборы + " "
|) КАК Границы
|"
ПоказатьЕсли не катит, значит проблема с отборами.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот