如何有效地实现分页?


9

我有一个数据库查询,可能会导致结果集很大。显示数据的客户端通过网络接收数据,因此,其想法是通过仅从数据库中检索前50个结果并将其发送给客户端,以最大程度地减少传输的数据量。然后,我将提供一个可能性,跳到第二页以检索下一个50个结果,等等(类似于Google提供的内容)

问题是实现分页的有效方法是什么。我想确保mssql尽可能多地使用缓存,并且每次更改分页时都不会再次执行该缓存。

同时有更多客户端正在查询数据库。使用的SQL引擎:MS SQL 2005

我的想法是:

  • 使用准备好的sql statemenst以确保执行计划共享
  • 使用ROW_COUNT变量仅检索所需的行

但这真的是最有效的方法吗?还是您认为最好检索整个结果集并在将数据发送到客户端的代码中实现分页?

谢谢您的提示!

问候,托马斯

Answers:


7

查询将每次执行。SQL Server不缓存结果。

只有在SQL Server 2011之前,才能实现正确的分页,但是在此之前,您可以选择的选项如下:

  • ROW_NUMBER()和按需查询
  • 客户端缓存

准备好的SQL语句也将每次执行。

如果您有胖客户端,则缓存是客户端本地的。除非您有数百万个斑点,否则这通常是可以的。

在我们的Web客户端中,我们呈现所有结果,但仅显示前100个结果,并具有“显示全部”按钮,而不是使用101+行扩展隐藏的DIV。我们不缓存在Web服务器中,也不提供分页。


谢谢。如果用户更改某些排序标准,哪种更好的方法是什么?我应该使用新条件再次执行查询还是在客户端上对结果进行排序?
Tomas Walek 2011年

1
我会在客户端排序。数据已经在那里。是的,数据库擅长排序,但是如果数据相同并且可用,为什么还要再次调用?我们使用jQuery附加组件在浏览器中启用排序:-)
gbn

4

这取决于您的环境。我会同时使用这两种方法进行测试,然后看看哪种方法最适合您。就个人而言,我将在服务器上页面。在线上的数据越少,客户端RAM中的数据越少越好。如果您可以控制客户端计算机的规格,则所有流量都通过不饱和的LAN传输,并且客户端始终快速地翻阅多个页面,那么您可能希望在客户端上进行页面调度。


谢谢。我实际上需要两者:服务器和客户端之间的通信是在WCF中实现的,因此消息的大小最大,并且如果结果集超出此大小,则我必须发送更多消息以将完整的数据传输到客户端。客户还喜欢快速浏览多个页面... :(
Tomas Walek 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.