@fuad99377

Почему запрос формируется бесконечно долго?

Запрос формируется бесконечно. Результат никак не могу увидеть. В чем может быть проблема?
ВЫБРАТЬ
	ЕСТЬNULL(СУММА(ВЫБОР
				КОГДА ВТ_БИ.ЭтоВалютныйСчет
					ТОГДА ВТ_БИ.ВалютнаяСуммаНачальныйОстаток
				ИНАЧЕ ВТ_БИ.СуммаНачальныйОстаток
			КОНЕЦ), 0) КАК НачальныйОстаток,
	ЕСТЬNULL(СУММА(ВЫБОР
				КОГДА ВТ_БИ.ЭтоВалютныйСчет
					ТОГДА ВТ_БИ.ВалютнаяСуммаОборотДт
				ИНАЧЕ ВТ_БИ.СуммаОборотДт
			КОНЕЦ), 0) КАК ВсегоПоступило,
	ЕСТЬNULL(СУММА(ВЫБОР
				КОГДА ВТ_БИ.ЭтоВалютныйСчет
					ТОГДА ВТ_БИ.ВалютнаяСуммаОборотКт
				ИНАЧЕ ВТ_БИ.СуммаОборотКт
			КОНЕЦ), 0) КАК ВсегоСписано,
	ЕСТЬNULL(СУММА(ВЫБОР
				КОГДА ВТ_БИ.ЭтоВалютныйСчет
					ТОГДА ВТ_БИ.ВалютнаяСуммаКонечныйОстаток
				ИНАЧЕ ВТ_БИ.СуммаКонечныйОстаток
			КОНЕЦ), 0) КАК КонечныйОстаток
ИЗ
	(ВЫБРАТЬ
		БИ.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток,
		БИ.ВалютнаяСуммаНачальныйОстаток КАК ВалютнаяСуммаНачальныйОстаток,
		БИ.СуммаОборотДт КАК СуммаОборотДт,
		БИ.ВалютнаяСуммаОборотДт КАК ВалютнаяСуммаОборотДт,
		БИ.СуммаОборотКт КАК СуммаОборотКт,
		БИ.ВалютнаяСуммаОборотКт КАК ВалютнаяСуммаОборотКт,
		БИ.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток,
		БИ.ВалютнаяСуммаКонечныйОстаток КАК ВалютнаяСуммаКонечныйОстаток,
		ВЫБОР
			КОГДА БИ.ВалютнаяСуммаНачальныйОстаток <> 0
					ИЛИ БИ.ВалютнаяСуммаОборотДт <> 0
					ИЛИ БИ.ВалютнаяСуммаОборотКт <> 0
					ИЛИ БИ.ВалютнаяСуммаКонечныйОстаток <> 0
				ТОГДА ИСТИНА
			ИНАЧЕ ЛОЖЬ
		КОНЕЦ КАК ЭтоВалютныйСчет
	ИЗ
		РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаИтоговНачалоДня, &ДатаИтоговКонецДня, , ДвиженияИГраницыПериода, Счет В (&СчетаССубконтоБанковскиеСчета), &ВидСубконтоБанковскиеСчета, Организация В (&Организации) {(ВЫРАЗИТЬ(Субконто1 КАК Справочник.БанковскиеСчета)) КАК БанковскийСчетИтогов}) КАК БИ) КАК ВТ_БИ


Пробовал логику этого же запроса и без вложенного запроса. Еще пробовал вместо ЭтоВалютныйСчет во вложенном запросе просто ставить условие, пример одного поля
ВЫБОР
    КОГДА ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстаток <> 0
    ТОГДА ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстаток
    ИНАЧЕ ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток
КОНЕЦ


Но все одно и то же. Параметр ВидыСубконтоХозрасчетные = БанковскиеСчета, параметры ДатаИтоговКонецДня и ДатаИтоговНачалоДня - это даты одного дня (08.01.2021 23:59:59 и 08.01.2021 00:00:00 соответственно)
  • Вопрос задан
  • 34 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Dementor
программист, архитектор, аналитик
Чтобы запросы выполнялись быстро, запросы должны быть понятными! Только для понятных запросов планировщик сможет создать план выполнения с максимальной эффективностью!

А что тут у вас???

1) Зачем тут вложенный запрос? Мало того, что он не имеет смысла, так он еще заставляет выделять в два раза больше памяти на стороне СУБД чем нужно. Удалить!

2) Зачем тут ЕСТЬNULL ? Эта функция для подстановки значений по умолчанию при соединениях (когда под условие соединения не попадают некоторые поля) или при обращении к реквизитам ссылки (когда ссылка может быть пустой). Тут нет ни первого ни второго случая. СУБД пытается понять что от нее хотят и делает ряд вспомогательных таблиц в памяти, которых вообще не должно было быть!

3) Почему в запросе 4 поля с функцией СУММА и ни одного группировочного? Это вообще не имеет смысла. Тем более, что виртуальная таблица РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты сама суммирует суммовые показатели по выбранным счетам/измерениям.

4) Почему каждое выбираемое поле обвернуто в условный оператор ВЫБОР? Это вообще не позволяет выполнять никаких оптимизаций.

Как это можно оптимизировать?

1) Запрос должен быть единым - без вложенных подзапросов и временных таблиц!

2) Вместо бредятины с анализом входящего и исходящего валютного сальдо нужно использовать признак валютности в счете (имею в виду бухгалтерский счет, а не мультивалютность в банковском счете). Различные валютные переоценки валютных счетов проходят только корректировкой балансовых сумм и с нулями по валютной сумме - в логике текущего запроса такие валютные счета будут считаться невалютными.

3) Сделать группировку суммовых полей (обычных и валютных) по признаку валютности - в результате получим не одну строчку, а две, но которые легко проанализировать в коде. В крайнем случае, если критически важно в результате выполнения запроса получить только одну строку, то можно нарушить совет №1 и сделать временную таблицу, чтобы потом во втором запросе уже за микросекунды соединить две строки в одну единую.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы