`
tou3921
  • 浏览: 68614 次
  • 性别: 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
我在项目中是这么用的。

相关推荐

    几种数据库的大数据批量插入

    特别是在处理大量数据时,批量插入可以大大提高数据库的写入效率。今天,我们将讨论几种数据库的大数据批量插入,包括 Oracle 和 SqlServer。 首先,让我们来看一下 IBatcherProvider 接口。这个接口是用于实现批量...

    C#大数据批量插入Access程序

    本程序" C#大数据批量插入Access程序 "就是针对这种需求而设计的,它允许开发者高效地将大量数据导入到Access数据库中。 Access数据库虽然在处理大规模数据时可能不如SQL Server等大型数据库系统强大,但在某些场景...

    ORACLE数据库中插入大字段数据的解决方法

    在ORACLE数据库中插入大字段数据时,可能会遇到性能问题或者由于字段长度限制导致的错误。这类问题通常涉及LOB(Large Object)类型的字段,如CLOB(Character Large Object)和BLOB(Binary Large Object)。本篇...

    insert和select结合实现”插入某字段在数据库中的最大值+1″的方法

    本文是mysql 数据库 问题一 将表一的数据导入表二...在表中插入数据时,某一字段取数据库中该字段的最大值,并+1,这个问题很多人都说用存储过程什么的解决,其实使用insert 和 select 结合就可以很好的解决这个问题啊

    Sqlite数据库里插入数据的条数上限是500

    今天在向Sqlite数据库里插入数据的时候,报了这样一个错: 代码如下: “too many terms in compound SELECT” 去Stackoverflow上查了一下,发现有人回答这个问题:链接 原来一次性向数据库里插入数据的条数不能太...

    c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)

    在C#中,进行大数据批量插入到不同的数据库如SQL Server、Oracle、SQLite和MySQL时,开发者需要考虑每个数据库系统的特性和API。以下是对这四种数据库批量插入操作的详细讲解: 1. **SQL Server批量插入** SQL ...

    c#实现几种数据库的大数据批量插入

    在C#中,可以创建一个事务,然后在一个循环中插入多条记录,确保所有插入都在一个事务中执行,以提高效率。 4. MySQL数据批量插入: MySQL也支持批量插入,可以使用`MySqlBulkLoader`类。创建这个类的实例,设置...

    Sqlserver大数据量插入速度慢或丢失数据的解决方法

    面对SQL Server在大数据量插入时出现的速度慢及数据丢失的问题,可以通过使用函数进行批量插入或采用BULK INSERT等命令来提高插入效率和数据完整性。这两种方法各有优缺点,根据实际情况选择合适的方案可以有效提升...

    C# Access 大数据量 批量 效率 快速 导入

    在C#中,可以创建一个DataSet或DataTable来存储待插入的数据,然后一次性将这些数据提交到数据库,显著提高导入速度。 以下是一些实现这一目标的关键知识点: 1. **批处理操作**:批处理是指一次性处理多个数据库...

    socket 大数据并列接收存数据库小列子(带多线程模拟数据)

    在处理大数据时,可能需要考虑分片(Sharding)、分区(Partitioning)或者批量插入(Bulk Insert)等策略,以提高写入效率和查询性能。此外,事务的正确性和一致性也很重要,尤其是在多线程环境下,需要确保数据的...

    vs自带数据库sql server的中文插入乱码问题、查找当前数据库名

    解决两个问题:vs自带数据库sql server的中文插入乱码问题、查找当前数据库名 (查找数据库名在文章中间,自己往下翻吧,不单拎出来了) vs自带数据库sql server的中文插入乱码问题: 如图所示,我插入表的中文变成...

    kettle对数据分表插入

    例如,我们可以计算输入数据的某个字段的哈希值,然后根据这个哈希值的模运算结果确定数据应该插入的子表。 哈希算法在这里起到了关键作用。常见的哈希函数如MD5、SHA-1等可以将任意大小的数据映射为固定长度的哈希...

    大数据领域的数据库有哪些分类

    在批处理数据库中,数据通常会被预先加载到内存中,然后通过并行计算的方式进行处理,从而大大提高了数据处理的速度。 - **例子**: Hive、Apache Pig等都是批处理数据库的代表。 **2. 流式处理数据库** - **特点**...

    上传文件及将大数据写入数据库并通过页面访问

    为了提高性能和减少内存占用,可以考虑使用分批次插入或者利用数据库自身的批量插入功能。 ### 四、通过页面访问已上传的数据 #### 4.1 查询数据库 使用SQL查询语句从数据库中检索已上传的文件信息。可以创建一个...

    JDBC批量插入 更新 删除等操作

    批量操作是指在一次数据库连接中执行多次SQL语句的操作,这种方式能显著提高程序性能,尤其是在处理大量数据时。 **批量插入**主要用于数据导入和日志记录等场景。例如,在日志系统中,通常会将日志信息先写入到...

    详细讲解提高数据库查询效率的实用方法

    21. **批量插入数据**:当需要大量插入数据时,采用批量插入的方式可以显著提高效率。 22. **优化删除操作**:在删除大量数据时,应避免一次性删除过多数据,可以考虑分批删除。 23. **合理使用存储过程**:存储...

    jdbc批量插入大字段

    在Oracle数据库中,Blob类型用于存储大量的二进制数据...总之,批量插入大字段是处理大量Blob数据的关键策略,通过JDBC提供的批处理功能,结合合理的事务管理和内存管理,可以显著提升Oracle数据库中的大数据插入效率。

    大数据知识点mysql数据库

    MySQL 数据库知识点总结 MySQL 是一种关系型数据库管理系统,目前版本为 5.7。在学习 MySQL 之前,需要了解数据库的发展阶段:人工阶段、文件系统阶段和数据库阶段。常见的主流数据库有 MySQL、Oracle、SQL Server ...

Global site tag (gtag.js) - Google Analytics