需要查询1200万行数据库,处理这些数据,然后将筛选后的数据插入到另一个数据库中。
出于明显的原因,我不能仅仅从数据库中执行SELECT * --我的程序将返回太多的数据供我的程序处理,而且这也是一个实时数据库(客户订单详细信息),而且我不能让数据库在运行我的查询时爬行10分钟。
我在寻找如何写这个程序的灵感。我要处理每一行。我在想,最好数几行。然后每次抓取X,等待Y秒,然后重复,直到数据集完成。这样,我就不会重载数据库,而且由于X足够小,所以在memmory中运行得很好。
其他建议或反馈?
发布于 2010-08-13 01:30:14
平面文件或快照都是理想的。
如果平面文件不适合,或者无法访问快照,则可以使用顺序id字段或在临时表中创建顺序id,然后使用该字段进行迭代。
有点像
@max_id = 0
while exists (select * from table where seq_id > @max_id)
select top n * from table where seq_id > @max_id order by seq_id
... process...
set @max_id = @max seq_id from the last lot
end如果没有顺序id,则可以创建一个保存顺序的临时表,如下所示
insert into some_temp_table
select unique_id from table order by your_ordering_scheme然后像这样处理
... do something with top n from table join some_temp_table on unique_id ...
delete top n from some_temp_table这样,temp_table保存仍然需要处理的记录标识符。
发布于 2010-08-13 00:50:10
我建议您阅读关于SELECT...INTO OUTFILE和LOAD DATA FROM INFILE的文档。
这些是将数据转储到平面文件然后导入到另一个数据库的非常快速的方法。
您可以将其转储到平面文件中,然后运行一个脱机脚本来处理您的行,然后完成后将结果导入到新数据库。
另请参阅:
”)
发布于 2010-08-13 00:56:45
随着时间的推移分散负荷似乎是唯一可行的解决办法。确切地说,如何做到这一点在一定程度上取决于您的模式,记录在“活动数据库”中是如何随时间变化的,以及您的处理必须具有什么样的一致性语义。
在最坏的情况下--任何记录都可以在任何时候更改,模式中没有任何东西可以让您轻松、快速地检查“最近修改、插入或删除的记录”,但您仍然需要在处理过程中保持一致--这项任务是完全不可行的,除非您可以依靠关系引擎和/或OS的某些特殊支持(例如卷或文件系统“快照”,比如Linux的LVM中的“快照”),使您能够廉价、快速地“冻结”DB驻留的卷的副本,以便稍后与另一个卷进行读取。数据库配置为从快照卷读取)。
但想必您确实有一些约束,模式中的某些东西有助于解决这个问题,或者,人们可以希望,您可以提供一些与处理同时发生的DB更改所产生的不一致性--有些行处理了两次,有些没有处理,有些在旧版本中处理,另一些在新版本中处理.不幸的是,你几乎没有告诉我们任何这些问题,使得提供更多的帮助在本质上是不可行的。如果您编辑您的问题以提供更多关于平台、模式和DB使用模式的信息,也许可以提供更多的帮助。
https://stackoverflow.com/questions/3473100
复制相似问题