采用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
建立表:
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
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句