`
tou3921
  • 浏览: 68620 次
  • 性别: 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 来做,不要使用游标一条一条的操作

相关推荐

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

    特别是在处理大量数据时,批量插入可以大大提高数据库的写入效率。今天,我们将讨论几种数据库的大数据批量插入,包括 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