请教个数据提取问题.
状况:
oracle9i数据库(也有SQL数据库的,是哪个无所谓).
两个表,
student学生表(id 学生号) 70 - 100万条记录
score分数表(id 学生号 , itemid 题号 , score 分数) 2000 - 3000万条记录
-----------------------------------------
要求:
两表id连接,同时对分数进行转换(如 score when 0 then A when 0.5 then B when 1 then C when 1.5 then D when 2 then E when 2.5 then F end,只有这六种)
如何能快速的按照上诉要求提取数据并将数据保存(DBF,TXT,XLS,这个大家不用考虑,我自己有代码).
目前,我用PB写的循环提取数据,花费时间约3.5个小时.
(如果石头来了,看看PB有没有好点的办法.)
注意:1)如果直接写SQL语句,会造成服务器内存不足.
2)不能直接打开库提取数据,数据是保密的.
------解决方案--------------------沙发
------解决方案--------------------先mark
------解决方案--------------------看看
------解决方案--------------------之前我寫過對1400萬左右的一個table,要生成report。
同樣是用reporting service提示out of memory。(服務器8G的內存)。
后來想想,反正要求是生成excel檔,而excel最多是66535條記錄,
所以就將其存入臨時表,加上標示自增id欄位,按60000一個excel,
用dotnet方式生成,每完成一個,就釋放memory,
這樣處理速度還可以。
一共230多個檔案,大概半個小時不到,就ok.
看到烏龜兄的這個,似乎有點相同,我想在sql里處理完數據,然后利用txt來裝資料,
每xx萬就釋放一下內存,然后再接下去寫txt檔。
------解决方案--------------------在PB中可以分批提取数据处理看看
------解决方案--------------------那先对score做视图转换成绩
------解决方案--------------------所以就將其存入臨時表,加上標示自增id欄位.
这个花费多少时间?
===========================================
今天怎么了,頁面刷不開,。。。。。
我在我們的服務器上轉,數據處理還蠻快的。沒幾分鐘吧。。。
處理的過程比較單純,也就是列轉行,行數固定,所以用union all的方式。
比如
select id=identity(int,1,1),col1
into tmp_T
from
(
select col1 from T
union all
select col2 from T
union all
....
) T
------解决方案--------------------我是覺得,大數據處理分2步來比較好,先server處理完數據。
然后程序來直接抓數據。
程序抓完一部分,可以釋放內存,就不會造成out of memory的情況了.
------解决方案--------------------如果是SQL,没有rownum这个东东,临时生成可麻烦。另外:学号不好分,是全国各地都有,而且从学号中不能区分是哪个省市的。
----
大体上分批,并不是严格10000一次,缩短一次处理的时间
所以你的学号不要区分 哪个省呀
------解决方案--------------------建议写一个函数 fn_ScoreToRank 完成这个转化
然后用SQL的bcp或者 oracle的导出命令来进行导出,这样速度会比较快,比如SQL的方法如下
bcp "select student.*, fn_ScoreToRank(score1), fn_ScoreToRank(score2)... from student, score where student.id = score.id" queryout data.txt -n -r \n -t \t -T"
其中-r \n -t 和 \t -T 分别控制换行符和字段分隔符。
------解决方案--------------------数据转换好像没有什么更好的方法了,,,
SQL code
create table score(id bigint2
------解决方案--------------------
我觉得能不能通过先吧不同等级的分数分类取到零时表中再进行处理