【问题标题】:Improving the performance of Page when it loads提高页面加载时的性能
【发布时间】:2013-01-31 03:43:18
【问题描述】:

我有一个 .aspx 屏幕,它在 asp:GridView 组件中显示一些数据。页面加载时最多可以返回大约 30k 条记录。 从数据库中检索 13000 条记录大约需要 30 秒。这是慢还是快? 我使用存储过程从数据库中检索记录我只查询数据库一次并存储它。然后 有一个 foreach 循环需要超过 2 分钟才能执行? 所以加载页面需要 4 分钟。

我只是 asp.net 的初学者。你能帮我改善页面加载时的延迟吗?

这是循环结构..我们可以以任何方式优化它吗?

List auditList = retrievedatafromdatabase();//该方法从数据库返回记录

               foreach (Entity obj in auditList)
                {

                    obj.CultSpecificRevisedData = "NULL";
                    obj.CultSpecificPublishedData = "NULL";

                    if (obj.RevisedData != null && obj.RevisedData != "NULL")
                        obj.CultSpecificRevisedData = ConvertToProfileSpecificFormat(Convert.ToDecimal(obj.RevisedData), DecimalSeparator);
                    if (obj.PublishedData != null && obj.PublishedData != "NULL")
                        obj.CultSpecificPublishedData = ConvertToProfileSpecificFormat(Convert.ToDecimal(obj.PublishedData), DecimalSeparator);

                    var yearPart = obj.CalendarYear;
                    var monthPart = string.Empty;
                    var frequencyName = GetEnglishFrequencyBame(frequencyTypeMasId);
                    if (frequencyName == FrequencyType.Monthly)
                    {
                        monthPart = new DateTime(obj.CalendarYear, GetMonthNumber(obj.Month), 1).ToString("MMM");
                        obj.CultSpecificPeriod = monthPart + "-" + yearPart.ToString();
                    }
                    if (frequencyName == FrequencyType.Quarterly)
                    {
                      UserMessage = obj.QuarterName;
                        obj.CultSpecificPeriod = UserMessage + "-" + yearPart.ToString();
                    }
                    else if (frequencyName == FrequencyType.BiAnnually)
                    {
                        UserMessage = obj.SemesterName;
                        obj.CultSpecificPeriod = UserMessage + "-" + yearPart.ToString();
                    }
                    else
                    {
                        obj.CultSpecificPeriod = yearPart.ToString();
                    }


                }

【问题讨论】:

  • 分页。您需要对数据进行分页。您能向我们展示您目前正在使用的代码吗?
  • 除了分页。检索需要 30 秒还是包括渲染?带有网格的 Viewstate 会变得非常大,从而导致页面膨胀。
  • 添加了分页。是的,检索需要 30 秒,然后在检索到的数据上运行 foreach 循环,这需要将近 2 分钟以上。
  • 启用分页。一旦检索到所有记录,然后在检索到的数据上运行 foreach 循环,这需要将近 2 分钟,然后使用数据网格显示。我设计了一个解决方案,比如只返回前 100\1000 并提供良好的搜索和过滤功能作为解决方法,但我的老板想知道是否有提高屏幕/数据查询性能的空间?有没有提高循环或存储过程性能的空间?

标签: c# asp.net


【解决方案1】:

分页是您的第一选择。

但您应该考虑以下几点: 你真的需要 30K 记录吗? 用户通常不会浏览前 10\20 条记录,尝试只返回前 100\1000 条记录,并提供良好的搜索和过滤功能,从而科学地限制结果集。

我遇到了同样的问题,我知道用户不需要那么多结果,他们需要一种从这些结果中找到他们想要的东西的好方法。

当然可以与分页结合在一起。

如果分页不适合您的解决方案(出于某种原因)您不同意所说的,请发布一些代码,我们将尝试帮助优化性能。请记住,有时这是一项非常艰巨的任务。

【讨论】:

  • 启用分页。一旦检索到所有记录,然后在检索到的数据上运行 foreach 循环,这需要将近 2 分钟,然后使用数据网格显示。我的目的与您提到的相同,例如仅返回前 100\1000 并提供良好的搜索和过滤功能作为解决方法,但我的老板想知道是否有提高屏幕/数据查询性能的空间?
  • 循环或存储过程的性能是否有提升空间?
  • 为 SQL 和 .NET 显示你的代码,我会发现总是有性能优化的空间,即为 SQL 建立索引并在 C# 中使用 LINQ ...
  • 问题中添加了循环结构。你能帮帮我吗?
  • 我已经弄清楚了在每次迭代中调用的 GetEnglishFrequencyBame(frequencyTypeMasId),它在每次迭代中都不需要。所以移出循环。现在我可以看到性能的提高。感谢您的宝贵意见.. 干杯 :)
【解决方案2】:

我会回应 cmets 关于并不真的需要 30K 记录。研究表明,人类无法真正在视觉上处理超过 2000 个列表项,如果您展示的内容超过此数量,您实际上是在欺骗用户,鼓励他们获得 false不完整对数据的理解。

但是如果你坚持这样做,你要做的就是遍历手工设置的记录,使用Response.Write()手动为每一行编写html并发送到浏览器,然后使用计数器不时调用 Response.Flush()。如果您的数据层也支持从数据库中流式传输数据(即:通过数据读取器)而不是将整个结果集加载到 RAM 中,则可以加分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多