您的位置:首页 > 数据库

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

2013-10-31 11:49 267 查看
采用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语句
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: