出个小题目,有兴趣的来看看,大数据量的匹配效率问题
Oracle数据库,817以上版本。
两份数据,每份1000万记录,除(唯一)主键外有300个字段。字段类型分别为char,number类型(char长度为50以下,number长度精度不等)。
问题:
如何对这2分数据进行比较。找出2份数据中,不能完全对应的数据。给出主键即可。
提示,不能完全对应有3中情况:
1、A数据中有的B没有
2、B数据中有的A没有
3、A,B数据中,200个字段中的任一个或多个字段不等。
自己刚搞完,想想有点意思,拿来大家讨论参考。
[解决办法]
watching
[解决办法]
用双指针p,q
int diff = p-> ID - q-> I
if diff ==0
test *p == *q?
else if diff > 0
out q++
else
out p++
[解决办法]
用时1000万+1000万
[解决办法]
偶想出一BT方法:
读出A里所有数据,
用std::map <主键,根据此记录所有数据连接成的字符串所生成的MD5码> 保存为mapA
然后一个个读出B的数据(也生成MD5码)对比好啦,哈哈,简单快捷有效,而且应该不会占用太大内存,MD5码才128/8=16字节 *10M = 160M 再加主Key的估计300M应该够了
[解决办法]
学习毛毛.
[解决办法]
happyct(绿叶对大树的情怀)
===========================
是有点乱七八糟的
不过是双表对比的标准算法
[解决办法]
提示,不能完全对应有3中情况:
1、A数据中有的B没有
2、B数据中有的A没有
3、A,B数据中,200个字段中的任一个或多个字段不等。
-------------------------------------
我来解决1和2,3只能给出个提示
1和2采用差集:mimus
A数据中有的B没有:
select A.key from A
mimus
select B.key from B
B数据中有的A没有:
select B.key from B
mimus
select A.key from A
3。求交集。oracle有现成的函数,但区分某些字段,比较麻烦,最好采用exist的方式来求。
select A.* from A
not exist (selct l from B where A.KEY =B.KEY)
[解决办法]
使用hash表的方法处理应该是不错的方法
也使用std::map
[解决办法]
動態生成這樣一條 SQL 語句:
select A.key
from
(select A.* from A left JOIN select B.* from B on A.key == B.key ) as C
where A.F1 <> B.F1 OR A.F2 <> B.F2 OR .......
不知道效率如何。。。。
[解决办法]
select A.* from A left JOIN select B.* from B on A.key == B.key
改成:
select A.*, B.* from A left JOIN B on A.key == B.key
[解决办法]
PPP的方式不可取
应该考虑别的方式~~~
[解决办法]
有對比就有進步。
我只是說了一個用標准SQL找到正確結果的方法。我也在等happyct的好辦法啊。
對比一下才能知道花費了不少力氣的新方法其效率提高了多少呀。
(同樣的SQL語句,不同版本的數據庫,其執行效率會有差異mimus也就Oracle才有啊。)
[解决办法]
用存贮过程比较好!
建立临时表,以前做大量数据处理里,就是这样的!