这是对问题的跟进: ASP.NET next/previous button to display single row in a form
正如上面页面上所说,页面上有一个上一个/下一个按钮,一次检索一行。
总共有约 500,000 行。
当我“翻阅”每个订阅号时,表格中会填满订阅者的详细信息。我应该在 SQL 服务器上使用什么方法?
使用 ROW_NUMBER() 函数似乎有点矫枉过正,因为它必须对所有 ~500.000 行进行编号(我猜?),那么还有哪些其他可能的解决方案?
提前致谢!
这是对问题的跟进: ASP.NET next/previous button to display single row in a form
正如上面页面上所说,页面上有一个上一个/下一个按钮,一次检索一行。
总共有约 500,000 行。
当我“翻阅”每个订阅号时,表格中会填满订阅者的详细信息。我应该在 SQL 服务器上使用什么方法?
使用 ROW_NUMBER() 函数似乎有点矫枉过正,因为它必须对所有 ~500.000 行进行编号(我猜?),那么还有哪些其他可能的解决方案?
提前致谢!
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 替换为所需行号的参数即可。
有两种可能的解决方法(为此,使用 201 开头,100 页):
SQL
SELECT TOP 100 * FROM MyTable WHERE ID > 200 ORDER BY ID
LINQ 到 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(),这是我放在最后的子句。
在这种情况下,表没有被索引,因此请参阅此处了解如何索引以提高查询性能的想法。
Tommy,如果您的用户有时间以每行一页的方式浏览 500,000 行,那么他/她就是独一无二的。
我想我在这里要说的是,您也许能够提供更好的用户体验。什么时候 - 页面太多?构建搜索功能。