高效率的Access\MSSQL分页的SQL语句

采用Access数据库有许多优点,比如数据库无须专门的数据库空间,使用,备份,迁移也非常方便。
但一旦数据量到达上万条,上十万条甚至更多的时候,ACCESS的大数据量的列表分页效率问题就出现了。
用普通的Recordset方法来分页会非常非常慢。
所以从SQL语句底层,找到高效率的分页方法才能优化效率,提高速度。

本文不再讨论用Adodb.Recordset,和SQL语句里的NOT IN或者MAX等方法。
因为这几种方法已经被证明无法承担起大数据量的分页任务。

给大家推荐的是双TOP法高效率的Access分页的SQL语句

先直接给SQL语句,然后再分析


SELECT * FROM 
 
(SELECT TOP "&pagesize&" * FROM 
 
(SELECT TOP "&page*pagesize&" 字段 FROM 表 ORDER BY id DESC) 
 
ORDER BY id) 
 
ORDER BY id DESC

mssql实现分页的存储过程

建立表:

 CREATE TABLE [TestTable] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

插入数据:(2万条,用更多的数据测试会明显一些)
SET IDENTITY_INSERT TestTable ON

declare @i int
set @i=1
while @i<=20000
begin
insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, FirstName_XXX,LastName_XXX,Country_XXX,Note_XXX)
set @i=@i+1
end

SET IDENTITY_INSERT TestTable OFF 

分页方案一:(利用Not In和SELECT TOP分页)

SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID 

分页方案二:(利用ID大于多少和SELECT TOP分页)

SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID 

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是: 


分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句

你可能感兴趣的:(高效率的Access\MSSQL分页的SQL语句)