请教各位,如何分批获取数据库中数据

请教各位,如何分批获取数据库中数据,第1张

在有些业务场景中需要分批去取数据库表中的全部数据来进行处理,最简单的方法就是使用分页查询语句(偷懒以MySQL为例):

[sql] view plain copy print?

select * from datatable limit offset,amount

select * from datatable limit offset,amount

这里就会有一个问题,随着offset值的越来越大,这条sql要扫描的表数据就会越来越多,因为要定位到offset这一行就需要扫描比offset小的所有行。显然在一张大数据量的表中,去这样做,性能就会出问题。为了避免这样的情形出现,我们自然会想到使用索引来解决,比如使用自增序列id进行分批取:

[sql] view plain copy print?

select * from datatable where id >= start and id<start+batchCount

select * from datatable where id >= start and id<start+batchCount

这样我们对id建索引,然后分批去取,显然效果会高很多,但是如果自增序列由于删除等 *** 作变得不是连续,就会出现空执行和多执行的情况出现。要解决这个方法,我们就需要结合使用索引和分页的优势来处理:

[sql] view plain copy print?

select * from datatable where id >= start limit batchCount

select * from datatable where id >= start limit batchCount

然后每次取回来我们再计算出起始id值,再去取下一批数据。这样就可以既避免了第一种不走索引,查询性能低下的问题,又解决了第二种id不连续,导致取回来的数据量不稳定导致浪费的问题了。

数据库分页嘛,很简单,看下面的代码

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

语句形式:

SELECT TOP 10 *

FROM TestTable

WHERE (ID NOT IN

(SELECT TOP 20 id

FROM TestTable

ORDER BY id))

ORDER BY ID

--SELECT TOP 20 id FROM TestTable ORDER BY id 查出前20条记录

--查出所有记录中不在前20条记录之外的前10条记录

SELECT TOP 页大小 *

FROM TestTable

WHERE (ID NOT IN

(SELECT TOP 页大小*页数 id

FROM 表

ORDER BY id))

ORDER BY ID

-------------------------------------

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

语句形式:

SELECT TOP 10 *

FROM TestTable

WHERE (ID >

(SELECT MAX(id)

FROM (SELECT TOP 20 id

FROM TestTable

ORDER BY id) AS T))

ORDER BY ID

--查出所有记录中不在前20条记录的最大值

SELECT TOP 页大小 *

FROM TestTable

WHERE (ID >

(SELECT MAX(id)

FROM (SELECT TOP 页大小*页数 id

FROM 表

ORDER BY id) AS T))

ORDER BY ID

-------------------------------------

分页方案三

select top 50 * from (select top 100 * from sysobjects order by id) as a order by id desc

或者 SELECT TOP PageSize * FROM(SELECT TOP nPage*PageSize * from YOURTABLE )


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9442252.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存