【问题标题】:ASP.NET, SQL 2005 "paging"ASP.NET,SQL 2005“分页”
【发布时间】:2009-06-29 15:05:02
【问题描述】:

这是对该问题的跟进: ASP.NET next/previous buttons to display single row in a form

正如上面页面上所说,页面上有一个上一个/下一个按钮,一次检索一行。

总共有 ~500,000 行。

当我“翻页”浏览每个订阅号时,表格中会填满订阅者的详细信息。我应该在 SQL 服务器上使用什么方法?

使用 ROW_NUMBER() 函数似乎有点矫枉过正,因为它必须对所有 ~500.000 行进行编号(我猜?),那么还有哪些其他可能的解决方案?

提前致谢!

【问题讨论】:

  • 你提到速度正在扼杀你。考虑到所有因素,500,000 行是相当小的土豆。您在数据库上建立了哪些索引?

标签: asp.net sql-server paging


【解决方案1】:

ROW_NUMBER() 可能是您的最佳选择。

来自这篇 MSDN 文章:http://msdn.microsoft.com/en-us/library/ms186734.aspx

WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60;

只需将 50 和 60 替换为所需行号的参数即可。

【讨论】:

  • 已经这样做了,而且速度很慢。我很好奇是否还有其他方法。
  • @Tommy Jakobsen:您在 SalesOrderHeader 表上有哪些索引?
  • 如果我使用的是 ROW_NUMBER(),我不需要索引,对吗?
  • @Tommy:什么?!索引是你的朋友。请使用它们。
  • @Tommy:在 SalesOrderID 上集群,在 OrderDate 上非集群非唯一
【解决方案2】:

Tommy,如果您的用户有时间以每行一页的方式浏览 500,000 行,那么他/她就是独一无二的。

我想我在这里要说的是,您也许能够提供更好的用户体验。什么时候 - 页面太多?构建搜索功能。

【讨论】:

  • 已有搜索功能。有一个 500.000 行的“单行分页功能”是愚蠢的,但这就是我的客户想要的 :)
  • @Tommy:是的,StackOverflow 上的所有问题都有分页。大约有 50,000 行,仍然需要分页。
  • @Eric - 我同意分页是必要的,几乎所有网站都以某种形式提供分页。我在谈论用户体验,所以@Tommy 没有错过一个让他的客户让事情变得简单(更)的技巧。在我所有这些年的谷歌搜索中,我从未超过第 3 页。我只是修改/优化我的搜索。
【解决方案3】:

有两种可能的解决方法(为此,使用 201 开头,100 页):

SQL

SELECT TOP 100 * FROM MyTable WHERE ID > 200 ORDER BY ID

LINQ to SQL

var MyRows = (from t in db.Table 
              order by t.ID ascending
              select t).Skip(200).Take(100)

如果您的 ID 字段有聚集索引,请使用前者。如果不是,这两者将花费相同的时间(LINQ 返回 500,000 行,然后跳过,然后占用)。

如果您按不是 ID 的内容进行排序并且已将其编入索引,请使用 ROW_NUMBER()

编辑:因为 OP 不按 ID 排序,所以唯一的解决方案是 ROW_NUMBER(),这是我放在最后的子句。

在这种情况下,表没有被索引,所以请参阅here 了解如何建立索引以提高查询性能。

【讨论】:

  • 我没有按 ID 排序。那么 ROW_NUMBER 是唯一剩下的解决方案了吗?
  • @Eric:您的第一个示例假定记录将按 ID 排序,并且编号中没有间隙。无论如何,您的第二个示例通常会被 LINQ-to-SQL 转换为 ROW_NUMBER() 查询。
猜你喜欢
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多