Помогите исправить запрос

1. w0r0n 4 27.06.20 13:07 Сейчас в теме
Прошу помощи с запросом который на большой файловой базе в х86 толстом клиенте выжирает все 4gb памяти которые выделяет операционная система и падает с ошибкой "Недостаточно памяти". Запрос строится по двум регистрам т.к. учет ведется без флажка "Вести учет товаров организаций в разрезе складов" и в регистре ТоварыОрганизаций просто не заполнена колонка "Склад".

Вот сам запрос:

	ЗапросОтрицательныеОстатки.Текст = "
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
	|	СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход - ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) КАК ОтрицательныйОстаток,
	|	ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
	|	ТоварыОрганизацийОстаткиИОбороты.Организация КАК Организация
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , ) КАК ТоварыОрганизацийОстаткиИОбороты
	|		ПО ТоварыНаСкладахОстаткиИОбороты.Регистратор = ТоварыОрганизацийОстаткиИОбороты.Регистратор
	|			И ТоварыНаСкладахОстаткиИОбороты.Номенклатура = ТоварыОрганизацийОстаткиИОбороты.Номенклатура
	|			И ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры = ТоварыОрганизацийОстаткиИОбороты.ХарактеристикаНоменклатуры
	|			И ТоварыНаСкладахОстаткиИОбороты.СерияНоменклатуры = ТоварыОрганизацийОстаткиИОбороты.СерияНоменклатуры
	|ГДЕ
	|	ТоварыНаСкладахОстаткиИОбороты.Склад = &СкладПокупателя
	|	И ТоварыОрганизацийОстаткиИОбороты.Организация = &ТекОрганизация
	|
	|СГРУППИРОВАТЬ ПО
	|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
	|	ТоварыНаСкладахОстаткиИОбороты.Склад,
	|	ТоварыОрганизацийОстаткиИОбороты.Организация
	|
	|ИМЕЮЩИЕ
	|	СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход - ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) < 0";
Показать


Очень надеюсь что ткнёте меня носом в то почему запрос выжирает всю память и как этого избежать.
+
По теме из базы знаний
Найденные решения
2. independ 1520 27.06.20 14:40 Сейчас в теме
(1) условие ГДЕ убрать и перенести в параметры виртуальных таблиц регистров

                                   |	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , Склад = &СкладПокупателя) КАК ТоварыНаСкладахОстаткиИОбороты
                                   |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , Организация = &ТекОрганизация) КАК ТоварыОрганизацийОстаткиИОбороты
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. independ 1520 27.06.20 14:40 Сейчас в теме
(1) условие ГДЕ убрать и перенести в параметры виртуальных таблиц регистров

                                   |	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , Склад = &СкладПокупателя) КАК ТоварыНаСкладахОстаткиИОбороты
                                   |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , Организация = &ТекОрганизация) КАК ТоварыОрганизацийОстаткиИОбороты
+
3. w0r0n 4 27.06.20 16:10 Сейчас в теме
(2) Спасибо. Так запрос ест не более 1Гб и выполняется успешно.
А если мне нужно в параметры виртуальной таблицы добавить еще одно условие то строка будет выглядеть так: "Склад = &СкладПокупателя И Номенклатура В(&МассивНоменклатуры)"?
+
4. independ 1520 27.06.20 17:14 Сейчас в теме
(3) верно, но есть мнение, что
Номенклатура В(&МассивНоменклатуры)
в условии вирт.таблицы - не очень оптимальный вариант отбора
+
5. w0r0n 4 27.06.20 17:18 Сейчас в теме
(4) Закономерный вопрос: А как оптимальнее сформировать запрос по списку номенклатуры?
+
6. Fox-trot 157 27.06.20 17:25 Сейчас в теме
только тесты/замеры ответят на данный вопрос
+
7. w0r0n 4 28.06.20 19:48 Сейчас в теме
Я наверно неправильно выразился.
Имел ввиду "какие варианты есть?".
Я их все проверю и здесь опубликую.
+
8. shmalevoz 304 30.06.20 01:35 Сейчас в теме
Добавлю к вышесказанному
1. Использовать более "легковесную" виртуальную таблицу Обороты вместо самой тяжелой ОстаткиИОбороты
2. Не видится большого смысла искать минусовые обороты в закрытых периодах. Начало выборки кажется можно ограничить датой запрета редактирования
3. Если верно, что интересуют минуса по ТоварыНаСкладах, ТоварыОрганизаций служит только для среза по организации и справки, и документы формируют движения только по одной организации, то запрос можно разбить на 2 подзапроса
- получить таблицу минусовых оборотов по складам, здесь в результате должно быть немного регистраторов
- и уже к этой таблице присоединять товары по организациям. в запросе кстати используется ЛЕВОЕ соединение, а если есть отбор, то более верным видится ВНУТРЕННЕЕ
т.е. сначала отобрать небольшой набор, а потом делать соединение. сейчас поскольку используется ИМЕЮЩИЕ сначала соединяются 2 немаленькие таблицы, потом значения группируются, вычисляются функции и только потом на значения функций накладывается отбор
+
Внимание! Тема сдана в архив

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