ут 10.3, платформа 8.2.19.80, база SQL, сам sql на отдельном сервере
Проблема вот в чем, если формировать отчеты без отборов и с подробной детализацией то появляется огромная проблема:
в системе после запуска сервера 1с, появляется 4 системных 1с процесса rphost(каждый в нормальном состоянии 1-2 гб), после начала формирования отчета один из rphost начинает сильно расти в оперативной памяти , если отчет с нормальным числом данных то это незаметно, а если за огромной период и детализацией по каждой строке регистра то он растет ОЧЕНЬ СИЛЬНО, после определенной точки передает данные рабочему процессу 1с82(откуда начали формировать отчет) , можно так попытаться сгруппировать/поставить отборы отчета, что rphost становиться больше 10-20 гб...как ограничить максимальный размер? Отчетов много, да и нельзя придумать алгоритм который заранее поймет что пользователь корректно выбрал отборы/группировки отчета..гуглил тоже некоторые сталкиваются с этим но решения не где не нашол, есть у кого опыт решения данной проблемы?
Проблема вот в чем, если формировать отчеты без отборов и с подробной детализацией то появляется огромная проблема:
в системе после запуска сервера 1с, появляется 4 системных 1с процесса rphost(каждый в нормальном состоянии 1-2 гб), после начала формирования отчета один из rphost начинает сильно расти в оперативной памяти , если отчет с нормальным числом данных то это незаметно, а если за огромной период и детализацией по каждой строке регистра то он растет ОЧЕНЬ СИЛЬНО, после определенной точки передает данные рабочему процессу 1с82(откуда начали формировать отчет) , можно так попытаться сгруппировать/поставить отборы отчета, что rphost становиться больше 10-20 гб...как ограничить максимальный размер? Отчетов много, да и нельзя придумать алгоритм который заранее поймет что пользователь корректно выбрал отборы/группировки отчета..гуглил тоже некоторые сталкиваются с этим но решения не где не нашол, есть у кого опыт решения данной проблемы?
По теме из базы знаний
Найденные решения
(8) можно получить сразу список тяжелых
set transaction isolation level read uncommitted
sel ect
top 100
creation_time,
last_execution_time,
execution_count,
total_worker_time/1000 as CPU,
convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
qs.total_elapsed_time/1000 as TotDuration,
convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
total_logical_reads as [Reads],
total_logical_writes as [Writes],
total_logical_reads+total_logical_writes as [AggIO],
convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO],
case
when sql_handle IS NULL then ' '
else(substring(st.text,(qs.statement_start_offset+2)/2,(
case
when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2
else qs.statement_end_offset
end - qs.statement_start_offset)/2 ))
end as query_text,
db_name(st.dbid)as database_name,
object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as object_name
fr om sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(sql_handle) st
where total_logical_reads > 0
order by AvgDur desc
Показатьsel ect
top 100
creation_time,
last_execution_time,
execution_count,
total_worker_time/1000 as CPU,
convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
qs.total_elapsed_time/1000 as TotDuration,
convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
total_logical_reads as [Reads],
total_logical_writes as [Writes],
total_logical_reads+total_logical_writes as [AggIO],
convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO],
case
when sql_handle IS NULL then ' '
else(substring(st.text,(qs.statement_start_offset+2)/2,(
case
when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2
else qs.statement_end_offset
end - qs.statement_start_offset)/2 ))
end as query_text,
db_name(st.dbid)as database_name,
object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as object_name
fr om sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(sql_handle) st
where total_logical_reads > 0
order by AvgDur desc
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) ture, "Допустимый объем памяти" отвечает за конкретный rphost или за все 4? "Интервал превышения допустимого объема" это через сколько завершить процесс после заполнения?
(3) прогать не боюсь, очень трудно/объемно для 10-15 отчетов придумать алгоритмы которые проверять корректность отборов с учетом того что все эти отчеты построены на Универсальном отчете, и переписаны сильно, с новыми отчетам на скд проблем нет
(3) прогать не боюсь, очень трудно/объемно для 10-15 отчетов придумать алгоритмы которые проверять корректность отборов с учетом того что все эти отчеты построены на Универсальном отчете, и переписаны сильно, с новыми отчетам на скд проблем нет
Может сначала получать количество строк в полученной выборке? Ведь функция Количество() должна быстро отработать (хотя, конечно, это "накладные расходы").
А можно и сохранять историю "плохих" запросов (так не надо будет ничего выдумывать, а просто записывать в регистр время выполнения тех или иных запросов). По мере накопления статистики можно "предупредить" ресурсоемкие запросы.
А можно и сохранять историю "плохих" запросов (так не надо будет ничего выдумывать, а просто записывать в регистр время выполнения тех или иных запросов). По мере накопления статистики можно "предупредить" ресурсоемкие запросы.
(8) можно получить сразу список тяжелых
set transaction isolation level read uncommitted
sel ect
top 100
creation_time,
last_execution_time,
execution_count,
total_worker_time/1000 as CPU,
convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
qs.total_elapsed_time/1000 as TotDuration,
convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
total_logical_reads as [Reads],
total_logical_writes as [Writes],
total_logical_reads+total_logical_writes as [AggIO],
convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO],
case
when sql_handle IS NULL then ' '
else(substring(st.text,(qs.statement_start_offset+2)/2,(
case
when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2
else qs.statement_end_offset
end - qs.statement_start_offset)/2 ))
end as query_text,
db_name(st.dbid)as database_name,
object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as object_name
fr om sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(sql_handle) st
where total_logical_reads > 0
order by AvgDur desc
Показатьsel ect
top 100
creation_time,
last_execution_time,
execution_count,
total_worker_time/1000 as CPU,
convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
qs.total_elapsed_time/1000 as TotDuration,
convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
total_logical_reads as [Reads],
total_logical_writes as [Writes],
total_logical_reads+total_logical_writes as [AggIO],
convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO],
case
when sql_handle IS NULL then ' '
else(substring(st.text,(qs.statement_start_offset+2)/2,(
case
when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2
else qs.statement_end_offset
end - qs.statement_start_offset)/2 ))
end as query_text,
db_name(st.dbid)as database_name,
object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as object_name
fr om sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(sql_handle) st
where total_logical_reads > 0
order by AvgDur desc
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот