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

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

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

如果是oracle,sql写做
select * from dual where exists (select * from 表名 where 条件)
这样会很快。
统计还需要出结果,上面这条语句会在找到第一条符合条件的数据时就返回。如果不出意外,时间<0.1秒。
62 楼 yao_2110 2008-09-12  
才几十万的数据量,加个唯一键不就解决了,怎么那么费劲,什么数据库啊??
61 楼 armorking 2008-09-12  
1、用batch方式插入到表结构相同的temp表,
这个temp表可以是实体表而不是临时表
insert into my_table_temp
...


2、用以下方式插入数据
insert into my_table
select a.*
from my_table_temp a
left join my_table b on
a.pk_1 = b.pk_1
and a.pk_2 = b.pk_2
...
where b.rowid is null

60 楼 igogo007 2008-09-12  
你的数据库难道不能设定为“唯一”?
59 楼 icewubin 2008-09-12  
卒子99 写道
vvgg 写道
hocus 写道
bluemeteor 写道
异常不是这么用滴!

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

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





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


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


写try catch,JVM在处理的时候,就是需要占用更多多资源了,不仅仅是发生异常以后


新版JVM的这个问题已经大大改善了,即使有的话,这个性能和数据库交互的开销比起来可以忽略的。
58 楼 卒子99 2008-09-12  
vvgg 写道
hocus 写道
bluemeteor 写道
异常不是这么用滴!

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

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





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


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


写try catch,JVM在处理的时候,就是需要占用更多多资源了,不仅仅是发生异常以后
57 楼 jyw 2008-09-12  
抛出异常的爱 写道
1. insert into temp

2. del temp where temp.id in (select temp.id from temp ,use where temp.value=use.value)

3. insert into use (value)values(select temp.value from temp group by temp.value)



和我的想法差不多
不过,我想在加一句
delete from temp
呵呵
56 楼 myhometel 2008-09-12  
学习学习学习学习
55 楼 ftplove 2008-09-12  
目的是往数据库插入批量数据,防止插入批量数据

我的想法是,先插入批量数据,然后删除重复的数据,保留其中一条
54 楼 weiqingfei 2008-09-12  
首先,像数据库插入数据时,数据库做了什么?

其次,异常是怎么抛出的?
53 楼 GFreedom 2008-09-12  
为什么非要放到数据库里面做?
52 楼 zhengzhong 2008-09-11  
merge into
51 楼 szhnet 2008-09-11  
还是用临时表吧
50 楼 danielTang 2008-09-11  
我一般都是直接用過程來進行的。感覺到效果應該能夠好一點吧
49 楼 kaka2008 2008-09-11  
tou3921 写道
那个集合适合百万数据啊,还是需要多个集合存储?


Map还行,List肯定不行了
48 楼 抛出异常的爱 2008-09-11  
1. insert into temp

2. del temp where temp.id in (select temp.id from temp ,use where temp.value=use.value)

3. insert into use (value)values(select temp.value from temp group by temp.value)
47 楼 xiaoyu 2008-09-11  
主要是先select count(*),再insert 中间有一个时间间隔,如果事务等级低(如果是搞的话,代价也会很大),就会有问题的。

一般我是这样:
try {
    insert....
} catch (...) {
   if (select count(*) > 0) {
       throw ....
   }

   throw ....
}
46 楼 tou3921 2008-09-11  
可能大家说的都有道理,我对于数据库、调优这方面不在行。
我试来下,目前采用了捕获异常的方式,也还蛮快的,重复数据毕竟不到10%。
还有从来没用过集合存储百万数据,刚试了下,main报错了。那个集合适合百万数据啊,还是需要多个集合存储?
45 楼 zhajie 2008-09-11  
抛出异常的爱 写道
zhajie 写道
看重复机率的问题

如果重复机率小于50%

百分之一万
应该使用捕获异常,
这是最优雅,
最体现java优点,
最符合逻辑的处理方式..

高效<>优雅


效率瓶颈主要在数据库,而不是应用,

简单的数据库并且尽量减少对数据库的访问,才能获得高效.
44 楼 抛出异常的爱 2008-09-11  
zhajie 写道
看重复机率的问题

如果重复机率小于50%

百分之一万
应该使用捕获异常,
这是最优雅,
最体现java优点,
最符合逻辑的处理方式..

高效<>优雅

相关推荐

Global site tag (gtag.js) - Google Analytics