1. w0r0n 27.06.20 13:07 Сейчас в теме

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

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

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

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


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

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

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

Вакансии

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Программист 1С
Санкт-Петербург
зарплата до 150 000 руб.
Полный день

Программист 1С
Екатеринбург
зарплата от 80 000 руб. до 130 000 руб.
Полный день

Ведущий программист 1С
Москва
зарплата от 150 000 руб.
Полный день

Ведущий программист 1С (УТ 11)
Москва
зарплата до 200 000 руб.
Полный день