作者smallyou1988 ()
看板Programming
标题[问题] 用资料库比对或是AP比对
时间Sun May 31 18:11:54 2015
请问各位大德
假设有两百个档案(或更多)
每个档案笔数是40000(四万)笔
资料库资料大约是几千万笔
目标是要将每个档案去碰资料库内存有的资料,然後做比对
环境只能用 UNIX的/bin/sh 和资料库
那该怎麽做会比较佳呢?
档案内容比如说:
number|starttime|endtime|sum
1111|04/01/2015|04/30/2015|10
1111|04/01/2015|04/30/2015|30
2222|04/01/2015|04/30/2015|20
2222|04/01/2015|04/30/2015|40
5555|04/01/2015|04/30/2015|10
9999|04/01/2015|04/30/2015|7
要将档案的number去和资料库内的某个table碰number後,得到number2(primary key)
再去其他table用number2做搜寻且加总用量(sum),然後比对!
目前的做法:
写回圈一个一个档案load进资料库temp table内
用sql去执行比对再unload下来,但是效能不佳(每个档案都要跑大概15~20分钟)
temp table加上index似乎也不会变快
改良的想法:
目前我想到的改良作法是一次将资料库所需资料unload下来
再用程式(可能开五支或更多背景程式)去执行grep之类的
这样也不会耗太多DB资源
这样会不会有点多余或是这是糟糕的想法呢?
是否请大德们可以给点建议或是提示呢?
谢谢 ^^
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 182.235.82.125
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Programming/M.1433067117.A.448.html
1F:→ MOONRAKER: 听起来你在SQL里面写回圈 是这样吗 218.161.46.90 05/31 18:13
2F:→ smallyou1988: 不是,是在外面写回圈 182.235.82.125 05/31 18:15
3F:→ MOONRAKER: 那你使用SQL如何比对 218.161.46.90 05/31 18:49
大大您好
我sql比对写法是包在shell内,内容大意如下:
for回圈
do
db语法 << EOF
create temp table aa(...省略 ) with no log;
load from 档案 insert into aa;
unload to mydata.txt
select 所需栏位 from aa a, XXXtable b, outer XXXtable c
where b.id=a.id
and b.id=c.id
and (...这里下的一堆条件都是按照资料库现有index顺序下的)
group by 栏位
EOF
done
其实就是这样而已,并没有甚麽特别之处
但是就是很慢
不管是条件顺序或是temp table的index我都调过或加过
DB不只我程式会执行 还有其他人程式也会去做其他作业
不晓得大大觉得哪边可以调整呢? :D
※ 编辑: smallyou1988 (182.235.82.125), 05/31/2015 22:25:19
※ 编辑: smallyou1988 (182.235.82.125), 05/31/2015 22:27:01
4F:→ MOONRAKER: 研究一下join 应该只需要用一次inner 218.161.46.90 05/31 22:52
5F:→ MOONRAKER: join就可得到所有特定栏位相同的列 218.161.46.90 05/31 22:53
6F:→ smallyou1988: 改用left join, 删减不必要select 111.81.73.108 06/02 20:29
7F:→ smallyou1988: 的栏位了 111.81.73.108 06/02 20:29
8F:→ n3oanderson: 确认一下table是在那个space建立. 111.243.94.63 06/03 07:15
9F:→ n3oanderson: script看能不能拆开用parallel执行. 111.243.94.63 06/03 07:16
10F:→ n3oanderson: 跑profiler察一下效能瓶颈. 111.243.94.63 06/03 07:18
11F:→ n3oanderson: 为何要把档案读进资料库在比对? 111.243.94.63 06/03 07:47
12F:→ n3oanderson: 不能直接在script里面比? 111.243.94.63 06/03 07:48
13F:→ n3oanderson: 用PK捞出来的资料量会很大? 111.243.94.63 06/03 07:49
14F:→ MOONRAKER: 既然用join应该就把所有资料合成一张大 61.221.51.43 06/05 17:25
15F:→ MOONRAKER: 表 join一次就有全部结果了 61.221.51.43 06/05 17:25