Память SQL сервера

1. yesmax7 11.04.22 10:07 Сейчас в теме
Формирую отчет. Он формируется примерно 5 минут.
Смотрю по утилите "Администрирование серверов", он забирает 6 ГБ оперативной памяти.
До 9-00 утра, пока других пользователей не было, отчет формировался нормально. После стали заходить другие пользователи.
Отчет доходит до 4 ГБ оперативной памяти и выходит ошибка "Недостаточно памяти для получения результата запроса к базе данных".
Это потому-что теперь общую память занимают другие пользователи?
По теме из базы знаний
Найденные решения
11. yesmax7 11.04.22 20:16 Сейчас в теме
(6)Единственный ответ по теме. Я хотел убедиться, что другие пользователи тоже занимают память. А то, что его надо оптимизировать, так я этим и занимаюсь, возможно бы потом сделал отдельную ветку по оптимизации. Да как раз и хочу сделать порциями, просто он СКДшный, тут надо будет подумать, как это вывести, чтобы все настройки СКД оставались
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 11.04.22 12:02 Сейчас в теме
(1) Скорее всего это говорит, что отчет написан некорректно, если требует такие объемы памяти сервера 1С.
7. yesmax7 11.04.22 19:58 Сейчас в теме
(2)Отчет типовой, Прайс-лист. КА 2.0. Есть один момент корявый в запросе, я уже поправил. Соединение с временной таблицей добавил в {}, оттуда все-равно не тянуться данные. Чучуть памяти меньше стал брать
3. starik-2005 3165 11.04.22 12:11 Сейчас в теме
(1)
"Недостаточно памяти для получения результата запроса к базе данных"
Так это 1Су не хватает памяти, или все-таки SQLу? Сдается, что 1Су. Добавьте памяти.
8. yesmax7 11.04.22 19:59 Сейчас в теме
5. Gilev.Vyacheslav 1917 11.04.22 14:29 Сейчас в теме
(1) вероятно пользователь не ставит отборы и в результате выбирается объем данных больше чем может переварить сервер
коллеги вам правильно пишут что самый не гемморойный вариант - добавить оперативки для x86-64 разрядного сервера 1С
самый правильный - выяснить у пользователя какой отчет он строит, может там слишком большой период, и наверняка по количеству строк которые глазами сразу прочитать нельзя, он это или выгружает потом, или по выведенному дополнительный поиск делает или т.п.
заголовок вопроса не корректный - речь про сервер 1С, для скуля в тексте мелькало бы "MS SQL Server"
9. yesmax7 11.04.22 20:08 Сейчас в теме
(5)Отчет не за период, а на дату. Некоторые отборы есть, но данных все равно много. 20 000 номенклатур перемножаем на 80 видов цен (плюс минус, не по каждой номенклатуре все 80 видо цен), получаем 1 600 000 детальных записей. но так как отчет сгруппирован по номенклатуре, а виды цен идут по колонкам, то визуально 20 000 строк (детальные записи не выводятся). Отчет стоит на рассылке, нужны все данные. Там проблема на самом деле в другом. Если в отчет добавить 10 дочерних реквизитов номенклатуры (некоторые из них доп. реквизиты) не в коде, а в пользовательском режиме (например, Номенклатура.Артикул), тогда отчет отъедал 30 гб, щас чуть меньше (я поправил запрос). А без этих полей укладывается в 3 ГБ.
12. Gilev.Vyacheslav 1917 12.04.22 09:47 Сейчас в теме
(9) ну я так и думал, делаете офлайновый прайс по всему, а люди потом ищут там нужную позицию
зачем они ищут цену по "выгрузке", а не в базе по конкретной позиции, у вас что сканера штрихкода нет?
13. EVKash 16 12.04.22 10:29 Сейчас в теме
(9)
получаем 1 600 000 детальных записей.

Не так уж это и много. Покажите сам запрос. Вангую, что оптимизатор там просто с ума сходит.
Если отключить автозаполнение и такой запрос подсунуть
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Номенклатура
ИЗ
	Справочник.Номенклатура КАК Номенклатура
{ГДЕ
	Номенклатура.Ссылка.* КАК Номенклатура}
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
	ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта
{ВЫБРАТЬ
	Номенклатура.*,
	ВидЦены.*,
	Цена,
	Валюта}
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
			&Период,
			Номенклатура В
				(ВЫБРАТЬ
					ВТ_Номенклатура.Ссылка
				ИЗ
					ВТ_Номенклатура КАК ВТ_Номенклатура)) КАК ЦеныНоменклатурыСрезПоследних
Показать

Как отработает?
14. yesmax7 14.04.22 09:34 Сейчас в теме
(13) Вот запрос. Комментариями //++++ я пометил свои изменения
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
Сегменты.Номенклатура КАК Номенклатура,
Сегменты.Характеристика КАК Характеристика,
ИСТИНА КАК ИспользуетсяОтборПоСегментуНоменклатуры
ПОМЕСТИТЬ ОтборПоСегментуНоменклатуры
ИЗ
РегистрСведений.НоменклатураСегмента КАК Сегменты
{ГДЕ
Сегменты.Сегмент.* КАК СегментНоменклатуры,
Сегменты.Номенклатура.* КАК Номенклатура,
Сегменты.Характеристика.* КАК Характеристика}

ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Характеристика,
ИспользуетсяОтборПоСегментуНоменклатуры
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
Ассортимент.Номенклатура КАК Номенклатура,
Ассортимент.ОбъектПланирования КАК ОбъектПланирования,
ИСТИНА КАК ИспользуетсяОтборПоАссортименту
ПОМЕСТИТЬ ОтборПоАссортименту
ИЗ
РегистрСведений.Ассортимент.СрезПоследних(&Период) КАК Ассортимент
{ГДЕ
Ассортимент.Номенклатура.* КАК Номенклатура,
Ассортимент.ОбъектПланирования.* КАК ОбъектПланирования,
Ассортимент.КоллекцияНоменклатуры.* КАК КоллекцияНоменклатуры,
Ассортимент.РазрешеныПродажи КАК РазрешеныПродажи}
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
ОбъектПланирования,
ИспользуетсяОтборПоАссортименту
;

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

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

ГДЕ
ЦеныНоменклатурыСрезПоследних.Цена > 0
{ГДЕ
ЦеныНоменклатурыОтбор.Цена КАК ЦенаОт,
ЦеныНоменклатурыОтбор.Цена КАК ЦенаДо
}
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Цены.Номенклатура,
Цены.Характеристика,
Цены.ВидЦены,
Цены.Цена,
Цены.Упаковка,
Цены.Валюта,
Цены.ЦеноваяГруппа,
Цены.Склад,
ВЫБОР КОГДА Цены.Остаток <0
ТОГДА 0
ИНАЧЕ Цены.Остаток
КОНЕЦ КАК Остаток,
ВЫБОР КОГДА (Цены.МетодОбеспеченияПотребностей = ЗНАЧЕНИЕ (Перечисление.МетодыОбеспеченияПотребностей.ЗаказПодЗаказ))
ИЛИ (Цены.МетодОбеспеченияПотребностей ЕСТЬ NULL И Цены.Остаток > 0)
ТОГДА ЗНАЧЕНИЕ(Перечисление.ДоступностьТовараДляКлиента.ПодЗаказ)
ИНАЧЕ Цены.ОстатокТекстом
КОНЕЦ КАК ОстатокТекстом
{ВЫБРАТЬ
Номенклатура.*,
Характеристика.*,
ВидЦены.*,
Цена,
Упаковка.*,
Валюта.*,
ЦеноваяГруппа.*,
Склад.*}
ИЗ
Цены КАК Цены
{ГДЕ
Цены.Номенклатура.*,
Цены.Характеристика.*,
Цены.ВидЦены.*,
Цены.Цена,
Цены.Упаковка.*,
Цены.Валюта.*,
Цены.Склад.*}
}
4. cdiamond 236 11.04.22 13:07 Сейчас в теме
Платформа точно 64 разрядная, на клиенте и сервере 1С?
10. yesmax7 11.04.22 20:09 Сейчас в теме
6. tetraren 37 11.04.22 19:21 Сейчас в теме
>Это потому-что теперь общую память занимают другие пользователи?

Да, возможная причина. Активные пользователи приводят к увеличению потребляемой СУБД памяти (особенно Постгрес чувствителен к количеству коннектов). В итоге процессам 1С доступно меньше. Далее сервер 1С смотрит, сколько памяти ей доступно и начинает давать отлуп всем пользователям, пытающимся выйти за 95% максимального потребления процессами rphost, чтобы не потратить память в 0 и не обрушить систему.

Оптимизируйте запросы так, чтобы данные выбирались порционно, через Выбрать(). Тогда не потребуется столько памяти, даже если объем данных будет большой.
11. yesmax7 11.04.22 20:16 Сейчас в теме
(6)Единственный ответ по теме. Я хотел убедиться, что другие пользователи тоже занимают память. А то, что его надо оптимизировать, так я этим и занимаюсь, возможно бы потом сделал отдельную ветку по оптимизации. Да как раз и хочу сделать порциями, просто он СКДшный, тут надо будет подумать, как это вывести, чтобы все настройки СКД оставались
15. yesmax7 14.04.22 09:50 Сейчас в теме
Всем спасибо

Если кому-то интересно, я сделал СтнадарнтаяОбработка = Ложь, и формирую отчет пакетно, передаю по 5000 номенклатур. Из-за того что отчет СКДшный, много всяких разных проблем. По сути я формирую несколько ТабДоков и все их присоединяю, выводя шапку только 1 раз. Также в каждом разном отчете могут быть разные виды цен, поэтому колонки с видами цен идут в разном порядке. Поэтому я насильно в каждый отчет добавил запись с пустой номенклатурой по каждому виду цены. А при выводе эти пустые записи удаляю.

Отчет формируется дольше, но зато не занимает много памяти. Для 5000 номенклатур максимальная память 2.3 ГБ. Если сделать пакеты еше меньше, соответственно памяти тоже меньше будет занимать
Оставьте свое сообщение

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