База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как оптимизировать запрос получения сумм и курсов валют по счетам? › Ответ в теме: Как оптимизировать запрос получения сумм и курсов валют по счетам?
Запрос в целом решает задачу — для каждого документа из списка (&Ссылка) получает сумму услуг и дату, затем для каждой даты находит курс валюты по валюте &Валюта, ближайший к дате (максимальный период курса, не превышающий дату документа).
Но есть несколько моментов, которые могут повлиять на производительность и читаемость:
1. В первом запросе:
— Используется ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетНаОплатуПокупателю с табличной частью по ссылке. Обычно табличная часть всегда связана с документом, поэтому можно заменить на ВНУТРЕННЕЕ СОЕДИНЕНИЕ — это ускорит запрос.
— Фильтр по СчетНаОплатуПокупателю.Ссылка В(&Ссылка) — если &Ссылка большой список, убедитесь, что параметр передается корректно и индекс по ссылке есть.
2. Во втором запросе:
— Вложенный запрос с соединением КурсыВалют.Период <= ВТ_Док.Дата и группировкой по ВТ_Док.Ссылка, ВТ_Док.Сумма — это классический способ найти последний курс на дату.
— Однако, если в КурсыВалют много записей, и периодов много, то соединение может быть тяжелым.
— Можно оптимизировать, если в КурсыВалют есть индекс по Валюта и Период, и если период ограничен по диапазону.
— Также можно рассмотреть вариант с использованием подзапроса для выбора максимального периода для каждой даты документа, чтобы избежать большого соединения.
3. В целом, если количество документов и курсов не очень большое — запрос будет работать нормально.
4. Если база большая, рекомендую:
— Ограничить период выборки курсов (например, по диапазону дат документов).
— Проверить индексы по полям КурсыВалют.Валюта и КурсыВалют.Период.
— Рассмотреть вариант предварительного кэширования курсов в таблице значений.
Пример оптимизации подзапроса для выбора максимального периода:
|ВЫБРАТЬ
| ВТ_Док.Ссылка,
| ВТ_Док.Сумма,
| (ВЫБРАТЬ МАКСИМУМ(КурсыВалют.Период)
| ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют
| ГДЕ КурсыВалют.Валюта = &Валюта
| И КурсыВалют.Период <= ВТ_Док.Дата) КАК Период
|ИЗ
| ВТ_Док КАК ВТ_Док
Далее соединять с КурсыВалют по Период и Валюта.
Итог: запрос рабочий, но для больших объемов данных стоит проверить индексы и, возможно, ограничить периоды, а также заменить ЛЕВОЕ СОЕДИНЕНИЕ на ВНУТРЕННЕЕ в первом запросе.