在 Sql Server 2008 中,许多选项可用于通过存储过程进行数据库分页。例如,请参见此处和此处。
选项:
- ROW_NUMBER() 函数
- 行数
- 光标
- 临时表
- 嵌套 SQL 查询
- 其他
已知使用 ROW_NUMBER() 进行分页存在性能问题:
请告知,哪种分页方法具有最佳性能(对于具有 JOIN 的大型表)?
如果可能,还请提供相关文章的链接。
谢谢你。
您必须回答的一个问题是,您是否想向最终用户显示总行数。要计算最后一页的编号,还需要最后一行的编号。
如果您可以不用这些信息,那么临时表是一个不错的选择。您可以选择 pirmary 密钥并使用 LIMIT 检索您感兴趣的密钥。如果您正确执行此操作,典型的用例将只检索前几页。
如果需要最后页码,可以使用 ROW_NUMBER()。使用临时表不会快很多,因为您不能使用 LIMIT 子句,使此策略等效于 ROW_NUMBER() 计算。
我们可以使用以下查询获得行数。
WITH data AS
(
SELECT ROW_NUMBER() OVER (order by memberid ) AS rowid, memberid
FROM Customer
)
SELECT *, (select count(*) from data) AS TotalCount
FROM data
WHERE rowid > 20 AND rowid <= 30