视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
真正高效的SQLSERVER分页查询
2020-11-09 10:10:00 责编:小采
文档

Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询每页30条,查询第1500页(即第45001-45030条数据),字段ID聚集索引,YEAR无索引,Sqlser

Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不大),服务器,分页查询每页30条,虚拟主机,查询第1500页(即第45001-45030条数据),字段ID聚集索引,YEAR无索引,Sqlserver版本:2008R2

第一种方案、最简单、普通的方法:

ARTICLE ID , ID ,ID DESC

平均查询100次所需时间:45s

第二种方案:


(
(ARTICLE , ID , f.ID ,s.ID DESC

平均查询100次所需时间:138S

第三种方案:

ARTICLE w1, ( ID FROM ( ID, , ID DESC ) w , w.ID ASC ) w2 , w1.ID DESC

平均查询100次所需时间:21S

第四种方案:

ARTICLE w1 WHERE ID in ( ID FROM ( ID, , ID DESC ) w , w.ID ASC ) , w1.ID DESC

平均查询100次所需时间:20S

第五种方案:

row_number() , ID w2.n ASC

平均查询100次所需时间:15S

查询第1000-1030条记录

第一种方案:

ARTICLE ID , ID ,ID DESC

平均查询100次所需时间:80s

第二种方案:


(
(ARTICLE , ID , f.ID ,s.ID DESC

平均查询100次所需时间:30S

第三种方案:

ARTICLE w1, ( ID FROM ( ID, , ID DESC ) w , w.ID ASC ) w2 , w1.ID DESC

平均查询100次所需时间:12S

第四种方案:

ARTICLE w1 WHERE ID in ( ID FROM ( ID, , ID DESC ) w , w.ID ASC ) , w1.ID DESC

平均查询100次所需时间:13S

第五种方案:

row_number() , ID w2.n ASC

平均查询100次所需时间:14S

由此可见在查询页数靠前时,效率3>4>5>2>1,页码靠后时5>4>3>1>2,再根据用户习惯,一般用户的检索只看最前面几页,因此选择3 4 5方案均可,若综合考虑方案5是最好的选择,但是要注意SQL2000不支持row_number()函数,由于时间和条件的没有做更深入、范围更广的测试,有兴趣的可以仔细研究下。

以下是根据第四种方案编写的一个分页存储过程:

dbo.sysobjects ) ) = 1) ..output, output, (((((, , NOCOUNT (3000) (100) (100) (4000) (4000) () (((,'') (,) ()SP_EXECUTESQL , @RCount OUTPUT,@PCount OUTPUT (()(()/@sys_PageSize) (()) (@sql) Exec(@sql) GO

,虚拟主机

下载本文
显示全文
专题