Эффективны ли подотчеты SSRS?
(Я разработчик с более чем 25-летним опытом, но я довольно новичок в SSRS, и поэтому я стараюсь лучше понять пару основных принципов.)
Суб-отчеты.
Все, что я до сих пор читал, - это то, что вы создаете подотчет как отдельный файл.rdl или.rdlc, а затем связываете этот файл с основным отчетом. Эта часть имеет смысл.
Однако в поисках справки о том, как сделать это эффективно, я вижу тот же шаблон, повторяемый в руководствах: используйте нефильтрованный оператор SELECT (без параметров или предложение WHERE) в качестве источника данных, а затем используйте фильтр, чтобы ограничить отображаемые данные что вам нужно.
Мне нужно понять только одну вещь. Является ли это "лучшим и единственным" способом, или это пример того, как работает, который проще всего объяснить, но на самом деле он работает ужасно под нагрузкой? Серьезно, никто не ожидает, что NorthWind или AdventureWorks станут реальными примерами сложных потоков данных.
Мы пишем этот отчет для клиента, который имеет десятки тысяч строк, которые будут возвращены в нефильтрованном операторе SELECT, но вернут максимум 10 строк, если я смогу использовать правильный оператор SELECT с предложением WHERE на основе переданного параметра из основного отчета в подотчет. Я пока не знаю, каким будет время отклика для этого отчета, но если он собирается извлечь и обработать много тысяч строк для подотчета, скорость будет ужасной.
Может кто-нибудь направить меня в блог или другой источник, где обсуждается эффективная обработка подотчетов SSRS?
1 ответ
Я могу только заключить, что все учебники, которые я нашел до сих пор, предлагали слишком упрощенные решения, которые просто плохо масштабируются.
Я ударил по теме, которая занималась другой проблемой, но ОП предложил свое решение, и это было именно то, что мне было нужно.
Подводя итог: 1) Поскольку подотчет является только.rdlc, для предварительной обработки вообще нет места. Любая про-обработка должна быть обработана в коде.ASPX.CS основного отчета.
2) В вашем.ASPX.CS Page_Load добавьте новый SubreportProcessingEventHandler в ReportViewer, например:
yourReportViewer.LocalReport.SubreportProcessing += new
SubreportProcessingEventHandler(SetSubDataSource);
yourReportViewer.LocalReport.Refresh();
3) В EventHandler вы устанавливаете соединение с базой данных и извлекаете только те данные, которые необходимы для вашего подотчета. Вы не получаете все это, а затем фильтруете, что ужасно неэффективно.
public void SetSubDataSource(object sender, SubreportProcessingEventArgs e)
{
// Reload the data required
SqlConnection conn = null;
SqlCommand cmd = null;
conn = new SqlConnection();
conn.ConnectionString =
ConfigurationManager.ConnectionStrings["connectionStringFromWebConfig"].ConnectionString;
conn.Open();
cmd = new SqlCommand();
cmd.Connection = conn;
SqlDataAdapter dataAdapter = new SqlDataAdapter();
DataSet dataset = new DataSet();
if (e.ReportPath == "yourSubReport")
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "yourSubReportStoredProcedure";
cmd.Parameters.AddWithValue("@subReportParam1", subReportParam1.Text);
dataAdapter = new SqlDataAdapter(cmd);
dataAdapter.Fill(dataset);
e.DataSources.Add(new ReportDataSource("yourSubReportDataSetName", dataset.Tables[0]));
}
}