Огромные отчеты

1. Cool_vsi 19.05.15 17:17 Сейчас в теме
ут 10.3, платформа 8.2.19.80, база SQL, сам sql на отдельном сервере

Проблема вот в чем, если формировать отчеты без отборов и с подробной детализацией то появляется огромная проблема:

в системе после запуска сервера 1с, появляется 4 системных 1с процесса rphost(каждый в нормальном состоянии 1-2 гб), после начала формирования отчета один из rphost начинает сильно расти в оперативной памяти , если отчет с нормальным числом данных то это незаметно, а если за огромной период и детализацией по каждой строке регистра то он растет ОЧЕНЬ СИЛЬНО, после определенной точки передает данные рабочему процессу 1с82(откуда начали формировать отчет) , можно так попытаться сгруппировать/поставить отборы отчета, что rphost становиться больше 10-20 гб...как ограничить максимальный размер? Отчетов много, да и нельзя придумать алгоритм который заранее поймет что пользователь корректно выбрал отборы/группировки отчета..гуглил тоже некоторые сталкиваются с этим но решения не где не нашол, есть у кого опыт решения данной проблемы?
По теме из базы знаний
Найденные решения
9. ture 611 20.05.15 13:12 Сейчас в теме
(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
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. ture 611 19.05.15 17:33 Сейчас в теме
(1) в отчетах можно навтыкать проверок, если прогать не боитесь
2. ture 611 19.05.15 17:32 Сейчас в теме
4. Cool_vsi 19.05.15 17:39 Сейчас в теме
(2) ture, "Допустимый объем памяти" отвечает за конкретный rphost или за все 4? "Интервал превышения допустимого объема" это через сколько завершить процесс после заполнения?

(3) прогать не боюсь, очень трудно/объемно для 10-15 отчетов придумать алгоритмы которые проверять корректность отборов с учетом того что все эти отчеты построены на Универсальном отчете, и переписаны сильно, с новыми отчетам на скд проблем нет
5. ture 611 19.05.15 17:41 Сейчас в теме
(4) да на отдельный.
Как превысит, так запускает новый и пересаживает туда все тонкие клиенты, а остальные вылетают спустя интервал.
7. Cool_vsi 19.05.15 17:43 Сейчас в теме
(5) ture, спасибо, сегодня после работы поставлю, завтра проверим как работает

(6) ture, да какой на ночь, за 5-10 минут он переполняеться и становиться больше 7-8 гб ( на сервере 32 гб и это с учетом других пользователей критично)
6. ture 611 19.05.15 17:42 Сейчас в теме
конечно неприятно, когда на ночь отчет оставил, а поутру не получил.
8. IvanAlekseev 78 20.05.15 12:17 Сейчас в теме
Может сначала получать количество строк в полученной выборке? Ведь функция Количество() должна быстро отработать (хотя, конечно, это "накладные расходы").

А можно и сохранять историю "плохих" запросов (так не надо будет ничего выдумывать, а просто записывать в регистр время выполнения тех или иных запросов). По мере накопления статистики можно "предупредить" ресурсоемкие запросы.
9. ture 611 20.05.15 13:12 Сейчас в теме
(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
Показать
Оставьте свое сообщение

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