Web 应用程序中的高效分页

Posted

技术标签:

【中文标题】Web 应用程序中的高效分页【英文标题】:Efficient paging in Web Application 【发布时间】:2012-02-26 09:11:32 【问题描述】:

我不熟悉 Web 应用程序中的分页。我在网上搜索了很多关于网站分页的教程(在 VS 中创建新网站)。我不能使用当前启用分页的方法 vs 可以轻松完成,因为它效率不高并且从数据库中检索整个数据表。

默认分页 - 只需选中数据 Web 控件智能标记中的启用分页选项即可实现。但是,无论何时查看数据页面,ObjectDataSource 都会检索所有记录,即使页面中只显示了其中的一个子集。

自定义分页 - 通过仅从数据库中检索必须为用户请求的特定数据页面显示的那些记录来提高默认分页的性能。但是,自定义分页比默认分页需要更多的努力来实现。

我正在为 Web 应用程序寻找自定义分页,希望你们能帮助我。 我发现了 2 个链接,我认为它们可能是自定义分页,但我不确定代码的哪一部分是这样说的,所以如果你能告诉我代码的哪一部分实际上使它变得高效,那就太好了谢谢!

这两个链接是 http://www.codeproject.com/Articles/170921/MvcContrib-Grid-Paging-and-Searching-in-ASP-NET-MV 和 http://blogs.msdn.com/b/codefx/archive/2009/09/07/how-to-implement-insert-edit-delete-paging-and-sorting-functions-in-an-asp-net-gridview-control.aspx?CommentPosted=true#commentmessage

再次感谢!

【问题讨论】:

解决方案实际上很大程度上取决于您的数据库后端是什么:名称和版本。例如,mysql 有一个非常适合分页操作的 LIMIT 命令。使用 MS SQL 当然可以进行分页,但是在 2005 年到 2008 年之间发生了根本性的特性变化,改变了这种方法。此外,您应该发布您需要的所有功能。例如,您是否允许它们根据单击列标题进行排序,或者您只是发出 X 条记录,底部有一个分页控件 【参考方案1】:

我不相信您的任何一个链接都表现出有效的分页

link 1 - LINQ 示例 为了使其有效,我希望在表单中看到一些东西

var myDataSource = data.Select(x => x.Parameter = "input").Skip(1).Take(10);

原理是skip和take方法只是检索你想要的数据页

link 2 - SQL 示例

再次不相信 - 我希望在 SQL 中看到使用 ROW_OVER() 的某些东西或其他一些 SQL 的证据,它只会带回您想要的数据页面。这个link 给出了一个在 SQL Server 2005 中使用 ROW_OVER 的示例(2008 年可能有所改进 - 我不知道 TBH - 其他人可能会感兴趣,我会感兴趣)。

一般情况

如果你有 ASP.Net 3.5 或更高版本,我会使用 LINQ 示例 - 这比尝试在 SQL 中执行要简单得多

这个link 给出了一个更好的例子,它使用带有 Take 和 Skip 运算符的 LINQ 来通过 ListView 进行高效的分页。它还解决了必须获取记录总数才能显示页数的问题,这是一个常见的要求。

另外,SO question 提供了一些非常好的高效分页示例,因此我建议您阅读。

LINQ 警告

正如下面的评论者所指出的 - 您需要确保在数据库上执行跳过和执行,而不是在客户端上执行、返回和执行跳过和执行的整个数据集。 Profiler 是您的朋友。还值得知道哪些运算符实现了查询并将其发送到数据库。

var myDataSource = data.Select(x => x.Parameter = "input").Skip(1).Take(10);

上面应该还可以

var myDataSource = data.Select(x => x.Parameter = "input")
                                  .ToList().Skip(1).Take(10);

哎呀,不好。 ToList() 方法将导致 SQL 在 Skip 和 Take 完成工作之前被触发到数据库。

【讨论】:

如果你打算使用 Linq 的 skip/take 方法,那么我会看看实际生成的 SQL,以确保它实际上是在合理有效地执行它(而不是说获取它们全部且仅在客户端跳过它们)。 我要说的是,您确实需要确保在数据库上执行 Skip 和 Take,并且您不会无意中 ToList 或其他东西然后意识到它们 - 好点 - 我会编辑

以上是关于Web 应用程序中的高效分页的主要内容,如果未能解决你的问题,请参考以下文章

使用MySQL的递延Join连接实现高效分页 - Aaron

REST Web 应用程序中的分页

My Sql 高效分页

REST Web 应用程序中的分页

JDBC在Java Web中的应用——分页查询

如何使用java中的selenium Web驱动程序中的分页搜索表中的元素