如何实现从一个大容量数据库比如上百万条数据,并且数据还在增加,控制每次从一张表取得1000条数据直到取完为止

xiaohua7988 2018-05-11 06:25:18
这是百度知道里的回答,这个页数不确定呀,要怎么实现呀?
...全文
1680 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2018-12-15
  • 打赏
  • 举报
回复
需提供表结构才能写SQL喔, 含字段,数据类型,主键约束,索引等.
刘兄弟 2018-12-14
  • 打赏
  • 举报
回复
我之前也是网上这些办法,后来觉得麻烦。 当然我是结合我的业务需求哈。 数据也挺多的200W行左右嘛。 我把本来需要一次查询出来的数据拆分了几次查询(比如一段时间的,我就按天分别查询了扔一个表里面去)在查询过程中就可以增加需要或者标记什么的了,之后前台查询的时候还不是为所欲为想怎么样就怎样啦) 很重要的一点是,我这个结果可以面向很多人,如果你的结果都是一次性的,那又要另外想办法了。
Dear SQL(燊) 2018-12-13
  • 打赏
  • 举报
回复
1.用脚本将数据库创建数据库快照同时为对应表创建触发器(或启用CDC功能)
2.用分页功能读取快照数据库中的表和快照之后变化的数据
_入门的_小白 2018-12-13
  • 打赏
  • 举报
回复
你好 我也在做这个 但是不太明白 可以帮助一下吗
吉普赛的歌 2018-05-11
  • 打赏
  • 举报
回复
-------------------- 准备测试表,生成 100 万条测试数据 ---------------------
USE tempdb
GO
IF OBJECT_ID('tempdb..info_data') IS NOT NULL
	DROP TABLE info_data
GO
CREATE TABLE info_data(
	dataId bigINT IDENTITY(1,1) PRIMARY KEY,
	n  NVARCHAR(MAX)	
)
GO
SET NOCOUNT ON
DECLARE @i INT,@iMax INT
SET @iMax=1000000
WHILE 1=1 
BEGIN
	SELECT @i=COUNT(1) FROM info_data
	PRINT @i
	IF @i>=@imax
	BEGIN
		BREAK;
	END
	IF @i=0
	BEGIN
		INSERT INTO info_data (n) VALUES(N'xxxxxxxxxxxxxxx')	
	END
	IF @i<=@imax/2
	BEGIN
		INSERT INTO info_data (n)
		SELECT n FROM info_data
	END
	ELSE
	BEGIN
		INSERT INTO info_data (n)
		SELECT TOP( @iMax-@i ) n FROM info_data
	END
END
-- 100 万数据就 6 秒 
----------------------- 下面是正式的过程 ------------------------------
--1. 准备一个正式的临时中转表
--之所以准备这个中转表, 是因为数据表即使是 标识列(自增),
--但实际上不可能是完全有顺序的
--中转表用于大批量分页是非常合适的
IF OBJECT_ID('tmp_loop') IS NOT NULL 
	DROP TABLE tmp_loop
CREATE TABLE tmp_loop(
	id INT IDENTITY(1,1) PRIMARY KEY,
	dataId BIGINT,
	INDEX ix_tmp_loop_dataId ( dataId )
)

--插入所有主键到中转表 ( 9s )
INSERT INTO tmp_loop(dataId)
SELECT dataId FROM info_data;

--以分页方式遍历所有记录,文本显示,( 1 m 24 s )
DECLARE @j INT,@jMax INT,@step INT
SELECT @j=0,@jMax=MAX(id) FROM tmp_loop;
SET @step = 1000;

WHILE @j+@step<=@jMax
BEGIN
	SELECT a.* 
	FROM info_data AS a INNER JOIN tmp_loop AS b
		ON a.dataId=b.dataId 
		AND b.id>@j AND b.id<=@j+1000;  	
	SET @j=@j+@step;
END
了解思路, 后面随便你用存储过程, 还是用程序, 都很容易。 至于什么数据不断在增加, 不需要管。 我的做法是取某一时刻的数据, 后面新增的不管。 因为即使你取了后面新增的,你刚取完,后面又增加了, 那你永远没有停止的时候。
shinger126 2018-05-11
  • 打赏
  • 举报
回复
你这是要做报表吧,用存储过程做,每次查询返回总页数和总行数,返回总页数和行数用output参数实现

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧