`
tou3921
  • 浏览: 68098 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

向大数据数据库中插入值时,还要判断插入是否重复,然后插入。如何提高效率

阅读更多
向大数据数据库中插入值时,还要判断插入是否重复,然后插入。如何提高效率。
每次insert时还要select下,现在数据库里的数据已有几十万条,这样批量插入的时候效率就会很低,不得不这么做,谁有好的方法。
想过把关键内容取来放在map或者list里,然后每次从集合里判断,可这样内存就吃不消了。
...........
分享到:
评论
43 楼 zhajie 2008-09-11  
看重复机率的问题

如果重复机率小于50%

百分之一万
应该使用捕获异常,
这是最优雅,
最体现java优点,
最符合逻辑的处理方式..
42 楼 抛出异常的爱 2008-09-11  
bluemeteor 写道
xly_971223 写道
bluemeteor 写道
异常不是这么用滴!

做好索引,select count(*)来判断才是正道

扯!!
楼主的情况下一定要进攻式编程, 假设不存在重复 直接插入,如果出异常表示存在重复

select count(*)方式 是防御编程不适合用在这种情况

当然还要考虑重复的比率,上面的方法适合重复比较少的情况


朋友,是和否你都说了,到底谁更能扯....

如果你是程序员,那你想进攻就进攻,想防守就防守。

但如果你是架构师,你需要去问问你的DBA,一个数据库的完整性异常都意味着什么,然后顺带问问DBA一次做了索引的select count(*)都做了什么。

没必要嚼舌头.
作个表试一下不就行了?
41 楼 bluemeteor 2008-09-11  
xly_971223 写道
bluemeteor 写道
异常不是这么用滴!

做好索引,select count(*)来判断才是正道

扯!!
楼主的情况下一定要进攻式编程, 假设不存在重复 直接插入,如果出异常表示存在重复

select count(*)方式 是防御编程不适合用在这种情况

当然还要考虑重复的比率,上面的方法适合重复比较少的情况


朋友,是和否你都说了,到底谁更能扯....

如果你是程序员,那你想进攻就进攻,想防守就防守。

但如果你是架构师,你需要去问问你的DBA,一个数据库的完整性异常都意味着什么,然后顺带问问DBA一次做了索引的select count(*)都做了什么。
40 楼 我很丑,但是我也不温柔 2008-09-11  
xly_971223 写道
bluemeteor 写道
异常不是这么用滴!

做好索引,select count(*)来判断才是正道

扯!!
楼主的情况下一定要进攻式编程, 假设不存在重复 直接插入,如果出异常表示存在重复

select count(*)方式 是防御编程不适合用在这种情况

当然还要考虑重复的比率,上面的方法适合重复比较少的情况


赞同。。。
39 楼 czllfy 2008-09-10  
tommy402 写道
不用这么麻烦吧,把插入表的主键做下过滤就可以了,
insert into a
select * from b
where b.id not exists (select 'x' from b where a.id = b.id)


大哥,你这样子不是要用到临时表吗????
38 楼 xiaoyu 2008-09-10  
xly_971223 写道
bluemeteor 写道
异常不是这么用滴!

做好索引,select count(*)来判断才是正道

扯!!
楼主的情况下一定要进攻式编程, 假设不存在重复 直接插入,如果出异常表示存在重复

select count(*)方式 是防御编程不适合用在这种情况

当然还要考虑重复的比率,上面的方法适合重复比较少的情况


一般我都是用进攻式编程。 因为先select (*)和插入数据之间有时间间隔(如果你事务是串行, 当我没有说过), 可能会导致数据重复而抛出异常。
37 楼 xly_971223 2008-09-10  
wolfbrood 写道
vvgg 写道
hocus 写道
bluemeteor 写道
异常不是这么用滴!

做好索引,select count(*)来判断才是正道

我也同意
异常不应该被用于流程和业务逻辑判断


重复数据也可以看作一种异常吧

感觉有重复数据的几率远小于正常的几率,所以产生异常的代价和每次查询相比应该算小的。

重复数据是一种业务逻辑,怎么是异常了。能用简单判断语句解决问题就绝不能用异常解决问题,这点道理都不明白吗?异常别滥用。

典型的教条主义 本本主义
有时候能解决问题比这些鸟理论更有实际意义
36 楼 或与非 2008-09-10  
先建Union索引,再用 insert ignore into tbl_name  VALUES (...);
自动忽略重复的数据
35 楼 xly_971223 2008-09-10  
bluemeteor 写道
异常不是这么用滴!

做好索引,select count(*)来判断才是正道

扯!!
楼主的情况下一定要进攻式编程, 假设不存在重复 直接插入,如果出异常表示存在重复

select count(*)方式 是防御编程不适合用在这种情况

当然还要考虑重复的比率,上面的方法适合重复比较少的情况
34 楼 kaka2008 2008-09-10  
插入的值是主键吗?
33 楼 jamesqiu 2008-09-10  
cenwenchu 写道
update,命中为0,就insert


你还不如先delete,不管结果如何都可以insert。

种种迹象表明,delete比update快些
32 楼 tommy402 2008-09-10  
不用这么麻烦吧,把插入表的主键做下过滤就可以了,
insert into a
select * from b
where b.id not exists (select 'x' from b where a.id = b.id)

31 楼 jwnest 2008-09-10  
按你的说法,操作比较频繁,而且表里面内容是只增不删的,肯定还是在内存里面维持一个关键字的map或者list合适,每次插入前先用程序过滤一遍,把重复的记录去掉再批量插入。
这个做法内存占用不会很大的,作为要判断是否重复的内容,肯定是类似名字或uid之类的内容,你总不可能通过比较两个很大的字符串来判断是否记录重复吧,这样的话,每条记录也就占几个字节,100万的记录也就占几兆内存而已。
需要注意的是数据同步的问题,就是怎么保证内存和数据库里面的记录是一致的,如果你能保证导入excel的操作同时只能一个用户进行的话,那就没有问题了。
30 楼 babbyyang 2008-09-10  
insert ignore
查查这个
29 楼 tou3921 2008-09-10  
freeric 写道
cenwenchu 写道
update,命中为0,就insert

支持

这样的话,90%到命中都是1,10%命中0才insert。
这样的话,每条数据还是要对数据库执行两次操作
28 楼 yinjh 2008-09-10  
tou3921 写道
还真热闹,看了这么多建议,我都有点晕了。
目前情况是:
数据库是oracle,此表只增补删。
一天可能要导入10-20个excel,每个差不多有5000-10000数据,重复数据是必须要过滤的。
20W次的过滤select和insert
或20W次中的10%次异常
或20W次的触发器
或者其他方法.....


这样的需求应该考虑试用ETL工具
像kettle
很简单的
27 楼 freeric 2008-09-10  
cenwenchu 写道
update,命中为0,就insert

支持
26 楼 tou3921 2008-09-10  
还真热闹,看了这么多建议,我都有点晕了。
目前情况是:
数据库是oracle,此表只增补删。
一天可能要导入10-20个excel,每个差不多有5000-10000数据,重复数据是必须要过滤的。
20W次的过滤select和insert
或20W次中的10%次异常
或20W次的触发器
或者其他方法.....
25 楼 icewubin 2008-09-10  
vvgg 写道
hocus 写道
bluemeteor 写道
异常不是这么用滴!

做好索引,select count(*)来判断才是正道

我也同意
异常不应该被用于流程和业务逻辑判断





重复数据也可以看作一种异常吧


感觉有重复数据的几率远小于正常的几率,所以产生异常的代价和每次查询相比应该算小的。


你怎么知道代价小,如果你实现一个数据库的异常,你会如何操纵数据,几种方法本质上还不是一样,无非就是看哪种方法能得到数据库的优化效率更高而已,楼上有位已经说过了,自己测一下很快就能得到结论,我认为效率应该是差不多的。

还有这种数据库异常不比Java异常,不同数据库的异常在不同jdbc驱动上表现出来的形式往往是很不一样的,建议不要依赖这种数据库异常为妙。
24 楼 jiming 2008-09-10  
jiming 写道
wolfbrood 写道


方法1:就是先把数据插入一个临时表,然后通过sql找出临时表里面哪些数据在正式表里面没有,然后把这些数据插入正式表。至于怎么找没有重复的数据那就是你的事,数据库存储过程可以完成,也可以写程序一条一条的读出。
这个方法避免了每次插入都要查找一次,但不一样的数据就要插入两次。至于效率问题你可以自己慢慢调优。



这个方法应该是最好的之一


补充一下,应该用批量 sql 来做,不要使用游标一条一条的操作

相关推荐

Global site tag (gtag.js) - Google Analytics