最近在做一个几百万条数据的分页查询,研究了各种方案,在本机上用项目的实际数据库做测试,测试过程 is very
痛苦,不堪回首ing。现在废话不多说,直接上结果,相信这也是大多数搜索答案的人最愿意看的方式。 以下是存储过程的代码:
[url=][/url]
CREATE PROCEDURE
[dbo.[P_GridViewPager
(
@recordTotal INT
OUTPUT,
--输出记录总数 @viewName VARCHAR(800),
--表名 @fieldName
VARCHAR(800)
= ‘*‘,
--查询字段
@keyName VARCHAR(200)
= ‘Id‘,
--索引字段
@pageSize INT =
20,
--每页记录数 @pageNo INT
=1,
--当前页 @orderString
VARCHAR(200),
--排序条件 @whereString VARCHAR(800) =
‘1=1‘
--WHERE条件)
AS
BEGIN
DECLARE
@beginRow INT
DECLARE
@endRow INT
DECLARE
@tempLimit VARCHAR(200)
DECLARE
@tempCount NVARCHAR(1000)
DECLARE
@tempMain VARCHAR(1000)
--declare @timediff datetime
set
nocount on
--select
@timediff=getdate() --记录时间
SET
@beginRow =
(@pageNo -
1) *
@pageSize +
1
SET @endRow
= @pageNo
* @pageSize
SET @tempLimit =
‘rows
BETWEEN ‘ +
CAST(@beginRow
AS VARCHAR)
+‘ AND ‘+CAST(@endRow AS
VARCHAR)
--输出参数为总记录数
SET @tempCount
= ‘SELECT @recordTotal = COUNT(*) FROM (SELECT
‘+@keyName+‘
FROM ‘+@viewName+‘
WHERE ‘+@whereString+‘) AS
my_temp‘
EXECUTE
sp_executesql @tempCount,N‘@recordTotal INT OUTPUT‘,@recordTotal
OUTPUT
--主查询返回结果集
SET @tempMain =
‘SELECT
* FROM (SELECT ROW_NUMBER() OVER (order by ‘+@orderString+‘) AS
rows ,‘+@fieldName+‘
FROM ‘+@viewName+‘
WHERE ‘+@whereString+‘) AS
main_temp WHERE ‘+@tempLimit
--PRINT
@tempMain
EXECUTE (@tempMain)
--select datediff(ms,@timediff,getdate()) as
耗时
set
nocount off
END
GO
完工!
原文:http://www.cnblogs.com/wosinren/p/3568085.html