Эффективны ли подотчеты SSRS? - PullRequest
       15

Эффективны ли подотчеты SSRS?

0 голосов
/ 20 сентября 2018

(я разработчик с более чем 25-летним опытом, но я довольно новичок в SSRS, и поэтому я стремлюсь, чтобы лучше понять пару основ.)

Sub-reports.

Все, что я до сих пор читал, это то, что вы создаете подотчет как отдельный файл .rdl или .rdlc, а затем связываете этот файл с основным отчетом.Эта часть имеет смысл.

Однако при поиске справки о том, как сделать это эффективно, я вижу тот же шаблон, повторяемый в руководствах: используйте нефильтрованный оператор SELECT (без параметров или предложение WHERE) в качестве источника данных,а затем используйте фильтр, чтобы ограничить отображаемые данные тем, что вам нужно.

Мне нужно понять только одну вещь.Является ли это «лучшим и единственным» способом, или это пример того, как работает, который проще всего объяснить, но на самом деле он работает ужасно под нагрузкой?Серьезно, никто не ожидает, что NorthWind или AdventureWorks станут реальными примерами сложных потоков данных.

Мы пишем этот отчет для клиента с десятками тысяч строк, которые будут возвращены в нефильтрованном операторе SELECT,но вернул бы максимум 10 строк, если бы я мог использовать правильный оператор SELECT с предложением WHERE на основе параметра, переданного из основного отчета в подотчет.Я пока не знаю, каким будет время отклика для этого отчета, но если он собирается извлечь и обработать много тысяч строк для подотчета, скорость будет ужасной.

Может кто-нибудь направить меня в блог илидругой источник, который обсуждает эффективную обработку подотчетов SSRS?

1 Ответ

0 голосов
/ 20 сентября 2018

Я могу только заключить, что все учебники, которые я нашел до сих пор, предлагали слишком упрощенные решения, которые просто плохо масштабируются.

Мне повезло в потоке, который имел дело с другой проблемой, ноОП выдвинул свое решение, и это было именно то, что мне нужно .

Подводя итог: 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]));
         }
    }
...