Помогите пожалуйста оптимизировать запрос

1. tatoshka0403 116 29.12.14 16:28 Сейчас в теме
ВЫБРАТЬ
	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет КАК Контрагент,
	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.Договор,
	ВЫБОР
		КОГДА КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток < 0
			ТОГДА 0
		ИНАЧЕ КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток
	КОНЕЦ КАК ОбщСуммаНачисленияОстаток,
	КВП_ЛицевыеСчетаСрезПоследних.Действует,
	КВП_ПлощадьПомещенияСрезПоследних.Площадь КАК ОбщПлощадь
ИЗ
	РегистрНакопления.КВП_ВзаиморасчетыПоЛицевымСчетам.Остатки(&Дата, Договор = &Договор) КАК КВП_ВзаиморасчетыПоЛицевымСчетамОстатки
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КВП_ЛицевыеСчета.СрезПоследних(&Дата, ) КАК КВП_ЛицевыеСчетаСрезПоследних
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КВП_ПлощадьПомещения.СрезПоследних(&Дата, ВидПлощади = &ВидПлощади) КАК КВП_ПлощадьПомещенияСрезПоследних
			ПО КВП_ЛицевыеСчетаСрезПоследних.Объект = КВП_ПлощадьПомещенияСрезПоследних.Объект
		ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = КВП_ЛицевыеСчетаСрезПоследних.ЛицевойСчет
ГДЕ
	КВП_ЛицевыеСчетаСрезПоследних.Действует = &Действует

СГРУППИРОВАТЬ ПО
	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет,
	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.Договор,
	КВП_ЛицевыеСчетаСрезПоследних.Действует,
	КВП_ПлощадьПомещенияСрезПоследних.Площадь,
	ВЫБОР
		КОГДА КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток < 0
			ТОГДА 0
		ИНАЧЕ КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток
	КОНЕЦ
ИТОГИ
	СУММА(ОбщСуммаНачисленияОстаток),
	СУММА(ОбщПлощадь)
ПО
	ОБЩИЕ
Показать

Запрос выполняет не быстро...есть подозрение вот на этот кусок. Может его лучше в коде через ЕСЛИ прописать в дальнейшем коде? Или где то еще ошибка?
ВЫБОР
		КОГДА КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток < 0
			ТОГДА 0
		ИНАЧЕ КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Boneman 301 29.12.14 16:33 Сейчас в теме
(1) tatoshka0403, еще бы знать состав регистров.

В общем случае, если в регистрах есть поля составных типов, то их надо выражать в зародыше.
4. Agapov_Stas 1 29.12.14 16:42 Сейчас в теме
(1) tatoshka0403,
Та нет
 ВЫБОР
        КОГДА КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток < 0
            ТОГДА 0
        ИНАЧЕ КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток
    КОНЕЦ КАК ОбщСуммаНачисленияОстаток,

Данная конструкция отрабатывает быстро
Возможно причина кроется в соединениях - т.к. они могут очень большие и т.д.
7. kofr1c 29.12.14 17:11 Сейчас в теме
(1) tatoshka0403, Надо бы сперва почитать и изучить рекомендации по запросам ;)
Нельзя делать соединения виртуальных таблиц! Необходимо сперва получать данные из виртуальных таблиц, затем запихивать их во временные и после делать соединения уже временных таблиц. Т.е. разделите запрос на пакет запросов
8. caponid 29.12.14 17:12 Сейчас в теме
(7) kofr1c,
Нельзя делать соединения виртуальных таблиц!

на самом деле можно...
9. kofr1c 29.12.14 17:14 Сейчас в теме
(8) caponid, кто ж спорит :) а после этого рождаются такого рода вопросы
3. tatoshka0403 116 29.12.14 16:35 Сейчас в теме
Составных типов там нет, выбор идет из числового измерения
5. caponid 29.12.14 16:54 Сейчас в теме
Можно попробовать выгрузить данные из регистров в ВТ и оценить их размер - если сильно большие - то подумать над доп ограничениями выборки.
Проиндексировать ВТ по полям соединения и сделать соединения ВТ.
6. PetroP 29.12.14 17:11 Сейчас в теме
Вот это:
ИЗ
    РегистрНакопления.КВП_ВзаиморасчетыПоЛицевымСчетам.Остатки(&Дата, Договор = &Договор) КАК КВП_ВзаиморасчетыПоЛицевымСчетамОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КВП_ЛицевыеСчета.СрезПоследних(&Дата, ) КАК КВП_ЛицевыеСчетаСрезПоследних
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КВП_ПлощадьПомещения.СрезПоследних(&Дата, ВидПлощади = &ВидПлощади) КАК КВП_ПлощадьПомещенияСрезПоследних
            ПО КВП_ЛицевыеСчетаСрезПоследних.Объект = КВП_ПлощадьПомещенияСрезПоследних.Объект
        ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = КВП_ЛицевыеСчетаСрезПоследних.ЛицевойСчет
ГДЕ
    КВП_ЛицевыеСчетаСрезПоследних.Действует = &Действует
Показать

Заменить на это:
ИЗ
    РегистрНакопления.КВП_ВзаиморасчетыПоЛицевымСчетам.Остатки(&Дата, Договор = &Договор) КАК КВП_ВзаиморасчетыПоЛицевымСчетамОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КВП_ЛицевыеСчета.СрезПоследних(&Дата, ) КАК КВП_ЛицевыеСчетаСрезПоследних
        ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = КВП_ЛицевыеСчетаСрезПоследних.ЛицевойСчет
            И КВП_ЛицевыеСчетаСрезПоследних.Действует = &Действует
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КВП_ПлощадьПомещения.СрезПоследних(&Дата, ВидПлощади = &ВидПлощади) КАК КВП_ПлощадьПомещенияСрезПоследних
        ПО КВП_ЛицевыеСчетаСрезПоследних.Объект = КВП_ПлощадьПомещенияСрезПоследних.Объект

Иначе у вас декартово произведение и внутреннее соединение.
10. chmv 29.12.14 18:12 Сейчас в теме
Составные поля замедляют работу
Оставьте свое сообщение

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