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

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

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

不知道合不合楼主的需求~
122 楼 qhsoft 2009-02-24  
叫我一声大哥,我帮你

我现在的效率是插入一条记录平均耗时1毫秒,判断是否重复几乎不消耗时间

最垃圾的办法是先select,不论是不是通过临时表
相对来说异常处理要快很多,但也不是最快
121 楼 fjlyxx 2008-12-19  
不知道 你数据的重复是否有关联的。就是说不一定主键一样才重复的,比如 只要A B两个字段都一样就是重复。 不同的情况会有不同的处理办法。
120 楼 feisishui 2008-12-19  
<pre name='code' class='java'>在表中创建一个timestamp列,使用key+timestamp,每次更新都更新timestamp,在更新前先来判断读时与更新时的timestamp是否一致。例子:
</pre>
<pre name='code' class='java'>    Connection conn = null;
      
    try {
        PreparedStatement stmt;
        long ts; //timestamp
      
        conn = ds.getConnection( );
        stmt = conn.prepareStatement("UPDATE Customer " +
                                     "SET firstName = ?, lastName = ?, phone = ?, " +
                                     "birthDay = ?, lastUpdateTS = ? " +
                                     "WHERE id = ? AND lastUpdateTS = ?");//注意条件
        stmt.setString(1, firstName);
        stmt.setString(2, lastName);
        stmt.setString(3, phone);
        stmt.setDate(4, birthDate);
        stmt.setLong(5, ts = System.currentTimeMillis( ));
        stmt.setInt(6, id);
        stmt.setLong(7, lastUpdateTS);
        stmt.executeUpdate( );
        lastUpdateTS = ts;
    }
    catch( SQLException e ) {
        e.printStackTrace( );
    }
    finally {
        if( conn != null ) {
            try { conn.close( ); }
            catch( SQLException e ) { }
        }
    }
</pre>
<p>     </p>
119 楼 swen00 2008-12-19  
tommy402 写道
不用这么麻烦吧,把插入表的主键做下过滤就可以了,
insert into a
select * from b
where b.id not exists (select 'x' from b where a.id = b.id)




支持这种方式,利用了索引,速度还是很快的
118 楼 liupopo 2008-12-19  
在一个事务中先删除,再插入。微软的PetShop里是这样做的。
117 楼 尔今尔后 2008-12-02  
hocus 写道
freeman_sh 写道
如果数据库支持sequence,用sequence是最佳方案。

如果我应用有多台oracle数据库捏?
如果下一个客户不用oracle,用db2捏?


-----------------------------
我想这样弄 是不是速度更快一些?

例如数据库已经有1千条数据,

1、首先从数据库里面查询出数据 放入一个hashmap里面
2、插入数据的时候判断hashmap时候存在这个数据 不存在直接插入。

因为要是每次插入 数据都select count(*) 是不是很耗费性能。

一次查询后 就交给计算机在内存中去处理  这样要比每次查询快很多。

116 楼 nomandia 2008-12-02  
bluemeteor 写道
异常不是这么用滴!

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

正解!
115 楼 nomadyyj 2008-12-02  
搂主这个需求和我的差不多(以人的基本信息为例:不能有身份证号和姓名重复的):
1,已有二千万的数据,保证库中的数据不重复(身份证号和姓名不重复).
2,批量插入(一批次一千条)
3,身份证号和姓名不是主键(可理解为逻辑上的主键)
4,目前方案为:先根据身份证号和姓名删,再插
114 楼 catmiw 2008-12-02  
在做设计的时候就要注意:INSERT就是INSERT,UPDATE就是UPDATE
表主键不要让用户(程序)设置,直接丢给数据库
比如ORACLE就用SEQ,MYSQL就用自增

在程序中判断,如果对象的ID为null或者是一个不合理的值(比如0),那么就INSERT。否则就UPDATE。

这样你就不会为这个问题烦恼了
113 楼 jeffyan 2008-12-02  
flykete 写道
设为主键,有时候违背意愿,设成unique的index,重复捕捉异常


这就违背了异常的意愿了
112 楼 fjlyxx 2008-12-01  
正规的途径是要建INDEX的 不过 也是要根据业务去走, 如果业务不是高并发的 那么查询一次在插也是可以的 没有必要浪费INDEX空间   如果也许是高并发的 其实可以考虑做成批量任务  后台定时去刷新纪录搞一个REDO小缓存.  当然你也可以把这个逻辑交给数据库去做.但不推荐. 这样做在群集的时候可能会有麻烦.
111 楼 yunsong 2008-11-18  
先全部插入,不要判断,然后删除重复数据
110 楼 chhj_292 2008-10-08  
bloodrate 写道
是不是必须2次访问数据库,一次询问一次插入?

大哥,你仔细看看回复总结一下,答案都已经说得很明确了。
109 楼 bloodrate 2008-09-28  
是不是必须2次访问数据库,一次询问一次插入?
108 楼 lujiadontcry 2008-09-27  
从语法上来看的话,oracle的merge 和 insert ignore 好像处理差不多,就是不知道是否有人测试对比一下;
107 楼 pdw2009 2008-09-25  
如果是oracle 可以使用merge来判断
106 楼 topcloud 2008-09-25  
为什么会有重复记录写入表中呢?首先考虑能否避免插入重复记录。

如果不能的话应该给表建立恰当的索引,来提高效率。
105 楼 imKenny 2008-09-24  
很想知道这问题的最优解决办法
因为我也碰到 这个问题了
104 楼 crabdave 2008-09-24  
tou3921 写道
向大数据数据库中插入值时,还要判断插入是否重复,然后插入。如何提高效率。
每次insert时还要select下,现在数据库里的数据已有几十万条,这样批量插入的时候效率就会很低,不得不这么做,谁有好的方法。
想过把关键内容取来放在map或者list里,然后每次从集合里判断,可这样内存就吃不消了。
...........




可以参考一下这篇文章 :http://crabdave.iteye.com/blog/189440
我在项目中是这么用的。

相关推荐

Global site tag (gtag.js) - Google Analytics