我有一个.aspx屏幕,在asp:GridView组件中显示一些数据。页面加载时最多可返回约30k条记录。 它需要30秒才能从数据库中检索13000条记录。这种速度是慢还是快? 我正在使用存储过程从数据库中检索记录我只查询数据库一次并存储它。然后 有一个foreach循环,执行时间超过2分钟? 所以它花了4分钟来加载页面。
我只是asp.net的初学者。你可以帮助我改善页面加载时的延迟吗?
这是循环结构..我们可以以任何方式优化它吗?
列表auditList = retrieveatafromdatabase(); //此方法返回数据库中的记录
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();
}
}
答案 0 :(得分:2)
分页是您的第一选择。
但你应该补充以下内容: 你真的需要30K的记录吗? 用户通常不会通过前10 \ 20记录,尝试仅返回前100 \ 1000并提供良好的搜索和过滤功能,这将对科学限制结果集。
我遇到了同样的问题,我明白用户不需要那么多结果,他们需要一种很好的方法来找到他们想要的结果。
当然可以与分页合并在一起。
如果分页不适合您的解决方案(由于某种原因)您不同意所说的内容,发布一些代码,我们将尝试帮助进行性能优化。请记住,有时这是一项非常艰巨的任务。
答案 1 :(得分:0)
我会回应关于不需要30K记录的评论。研究表明,人类无法在视觉上处理超过大约2000个列表项目的任何内容,如果您显示的内容超过此类,则通过鼓励他们获取 false 或不完整的数据感。
但是如果你坚持这样做,你想要做的就是遍历手工设置的记录,使用Response.Write()手动编写每行的html并将其发送到浏览器,然后使用计数器不时调用Response.Flush()。如果您的数据层也支持从数据库中流式传输数据(即:通过数据加载器),而不是将整个结果集加载到RAM中,则可以获得奖励。