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