- 浏览: 562874 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (411)
- webservice (3)
- oracle (37)
- sqlserver (8)
- j2ee (56)
- linux (7)
- javaweb (47)
- office (1)
- struts (23)
- hibernate (11)
- spring (29)
- 网络 (2)
- tomcat (13)
- tongweb (0)
- weblogic (0)
- powerdesiginer (3)
- svn (3)
- js (20)
- ie (2)
- 编译 (3)
- css (2)
- 操作系统 (5)
- Android (41)
- jbpm4.3 (1)
- fckeditor (3)
- 操作excel (2)
- db2常用命令 (1)
- ibatis (5)
- mysql (16)
- 表达式语言 (1)
- java方式调用存储过程 (1)
- ca (1)
- linux客户端 (1)
- 电子数码 (1)
- 行业应用 (12)
- 开发工具 (4)
- 面试 (1)
- 计算机原理 (1)
- NOSQL (5)
- 虚拟机 (1)
- nginx (0)
- velocity (2)
- jndi (1)
- spring mvc (39)
- springmvc (32)
- 安全 (5)
- htmleditor (6)
- iphone4 (1)
- html (4)
- jstl (2)
- ckeditor (5)
- 连接池 (1)
- jquery (6)
- 分页 (1)
- 技术研发规则 (1)
- javamail (1)
- maven (2)
- upload (1)
- log (1)
- 测试 (10)
- spring roo (1)
- 版本控制 (2)
- find bugs (0)
- jsf (0)
- springroo (0)
- 小道理 (1)
- 小道理,技术标准 (1)
- jsf (0)
- bitbao (2)
- redmine (3)
- 团队意识 (1)
- mybatis (2)
- jquery mobile (1)
- flexpaper (0)
- json (4)
- URLRewriteFilte (1)
- html5 (1)
- 都乐保活动 (0)
- openfire (0)
- TreeMap (1)
- build (0)
- javaweb,tag (0)
- algorithm (1)
- tag (2)
- 扯淡 (0)
- mac (2)
- 叶一火(老一) (1)
- 游玩 (1)
- 编码 (1)
- 上线部署 (0)
- 研发管理 (0)
- thumbnailator (2)
- 旅游 (0)
- bingweibo (1)
- 杂谈 (4)
- ktv (1)
- weibo (1)
- 爱情 (2)
- 饮食 (1)
- MediaWiki (1)
- git (1)
- 版本库 (1)
- servlet (1)
- 感悟 (1)
- 人生 (1)
- highcharts (1)
- poi (0)
- websphere (0)
- php (1)
最新评论
-
woshixushigang:
good
org.springframework.beans.TypeMismatchException: Failed to convert property valu -
nathanleewei:
org.springframework.jdbc.core.B ...
org.springframework.beans.TypeMismatchException: Failed to convert property valu -
浪禾木:
请问是ckeditor\contents.css吗?改过以后 ...
ckeditor自动换行问题 -
simusuishi:
刚哥威武!
ckeditor取值赋值问题 -
a455642158:
收割完毕……
Android开源项目源码下载(不断更新中)
大家都知道,招聘系统有用户投递简历的操作,用户可以选择多条职位信息进行投递。显然对存简历id和公司发布信息id的中间表操作时非常频繁的,如何优化效率是关键。
细节一:同时插入多行记录时,宜采用一条Insert语句
在数据插入时,往往需要同时往一个表中插入多条数据。如以ERP系统的采购订单为例。用户在前台客户端录入采购订单时,有可能需要向同一个供应商同时采购多个原材料。此时在数据库中,就需要往一个表格中同时插入多条记录。在插入数据时,可以通过两个方式实现。一是采用多条Insert语句,每个Insert语句插入一条记录。另外一种方式是只采用一条Insert语句,插入多条语句。采取这两种方式,有什么差异呢?
从语言编写的角度看,第一种方式比较清楚明了。但是从数据插入速度的角度来看,第二种方式性能比较好。特别是一次性插入一两百条记录时,两者所需要的时间会相差一倍以上。如下图所示,就是使用一条Insert语句插入多条记录的举例。
总之在数据插入时,需要注意使用带有多个值列表的Insert语句一次插入多行记录要比使用一个单行插入语句快很多。而且随着行数的增加,这个差异会越来越大。在数据库设计时,如果有设计到同时插入多条数据的纪录,如通过客户端导入基础数据、通过前置单据自动生成相关单据,这些作业都会遇到向某个表中一次性插入多条记录的情况。此时从提高数据库性能的角度考虑,笔者建议采用一个Insert语句同时插入多条记录的方式。虽然说编写语言的时候会增加复杂程度,但是这点投资与数据库性能优化相比而言,是值得的。
细节二:批量插入记录时,建立采用Load Date Infile语句
有时候可能需要往Mysql数据库中批量导入数据。如在ERP系统初始化过程中,需要将产品数据导入到系统中。实施顾问一般会要求用户根据他们的格式准备好相关的数据,然后利用导入作业,将这些数据一次性导入到数据库中。虽然这个导入作业是通过前台客户端来完成的,但是最终仍然是反映在数据库中。
针对这种批量数据的导入,数据库又提供了两种方式。一是上面所介绍的,采用一个Insert语句插入多行记录的方式;另外一种就是采用Load Date Infile的方式。这两种方式有什么差异呢?Load Date Infile顾名思义,就是从一个文件中导入数据。为此如果采用这种方式的话,用户需要预先准备一个固定格式的文件。而Insert语句的话,没有这个要求,其可以直接利用其他作业中获得的数据。从这个角度讲,如果插入的纪录数比较少(如在一百条左右)或者通过系统交互来获得数据,此时比较适合使用Insert语句。从性能的角度考虑,通常情况下使用Load Date Infile语句的方式插入数据要比使用Insert语句速度快10到20倍。为此如果插入的数据量比较多,如期初导入数据时可能会有超过上万条的记录,此时使用Load Date Infile的方式能够取得比较好的性能。
细节三:插入延迟,提高插入操作对系统的不利影响
在某些情况下,用户对插入数据的即时性要求可能并不是很高,此时就可以考虑通过插入延迟特性,来减少插入操作对系统资源的耗用。笔者再以ERP系统为例。在ERP系统中,有一个安全库存管理的作业。如果启用了这个作业的话,那么系统会在每天一个固定的时刻,分析账上的库存数据与安全库存之间的关系。如果发现库存数量低于安全库存时,系统就会自动生成一张请购单,将差异的数据插入到后台的数据库表中。显然,对于这些记录,用户并不需要等待数据的插入完成。如在前台调用这个作业时,可以将这个作业放在后端执行。等到执行完毕后,再通知用户即可。
在遇到这种情况时,就可以使用插入延迟的功能。当数据库工程师启用插入延迟功能时,服务器会立刻返回,而不会在那边等着数据插入完成。如果表中没有被其他线程所调用的情况,那么记录会排队等待被插入。使用这个插入延迟特性,还能够带来另外一个好处。当多个作业同时往同一个表中插入数据的时候,这些进程会被记录在同一个Block中。这就好像将多个单独的Insert语句合并成一条Insert语句来执行,其速度会快许多。
细节四:在插入大量数据之前,可以先将表锁定
在数据库库中,某些表只有特定的用户才使用。而且每次使用时可能会同时插入多条数据。如在ERP系统中导入期初数据时,就会碰到这种情况。从前台客户端导入产品数据时,通常情况下中间会有一个过渡表。用户可以通过这个过渡表来核对数据是否准确。如果没有问题的话,再将其导入到产品信息表中。采取这种方式,用户还可以查询到有哪些记录没有被导入到系统中。
由于期初数据的导入,一般是有系统管理员来完成的。此时这张过渡表只有一个用户使用。为了提高数据插入的效率,数据库工程师可以考虑,在插入之前先将表锁定。这可以提高数据插入的性能。这主要是因为索引缓冲区只是在所有的插入语句完成之后才对磁盘进行一次性刷新。也就是说,有多个插入语句就会有多少次索引缓冲区刷新。为此在数据插入之前,将数据表进行锁定,就可以大幅度的提高数据插入的效率。
细节五:插入数据之前先对数据进行排序
众所周知,在对记录进行排序时,需要耗费一定的系统资源。如果在插入数据时,就能够考虑到排序问题,那么在后续记录查询时,就可以避免重新排序所造成的二次开销。故笔者建议,在可行的情况下,在对数据插入之前先对记录根据一定的规则进行排序。
如在采购订单行表中,同时插入多条语句(从物料申购单转换为采购订单)。在采购订单行中插入多条记录之前,可以根据用户的使用习惯,如按照产品的编号进行排序。用户在后续查询时,就可以直接使用查询的结果(默认情况下是根据记录插入的先后顺序来显示结果的)。显示时就不需要再进行一次排序作业,从而可以提高数据后续查询的效率。
上面笔者提到的这个些内容,其实都是插入作业中的一些细节问题。但是这些细节内容,对于提高数据库的插入效率有很大的帮助。有时候单纯的通过提高硬件配置来改善数据库的性能,还不能够提到这么明显的效果。
发表评论
-
sql查询不同用户下得表
2013-03-08 10:26 0查询当前用户的表 SELECT table_nam ... -
where 1=1或者 0 =0
2011-09-16 18:39 676sql where 1=1和 0=1 的作用 where ... -
事务开始和结束
2011-08-19 19:13 1083《Oracle Database 11g SQL开 ... -
事务的隔离级别
2011-08-19 00:06 629如果DBMS支持事务处理 ... -
事物隔离级别
2011-08-19 00:03 1187事物隔离级别(转 ... -
case when和decode
2011-08-16 18:15 931Oracle的DECODE函数功能很强,灵活运用的话可以避免多 ... -
创建存储过程
2011-08-10 22:29 681--创建存储过程 CREATE OR REPLACE PRO ... -
Oracle字符集
2011-07-22 22:06 916一、什么是Oracle字符集 Oracle字 ... -
sequence和trigger引发的低级错误
2011-07-22 16:55 1043本人做国家林业局政法司项目时候遇到了一个低级的错误:新 ... -
connect by prior start with
2011-07-21 16:46 894connect by prior start with ... -
oracle级联查询当前地区的子地区
2011-07-20 11:11 905select id from AREA connect by ... -
java.sql.SQLException: 无法转换为内部表示
2011-07-20 10:19 2694项目中因某种需求,在程序中操作数据的SQL加行级锁,避免出 ... -
往表插入其他表数据
2011-07-19 15:48 795insert into future.news(a,b,c) ... -
java.sql.SQLException: 类型长度大于最大值 原因
2011-07-19 14:04 1205可能是驱动问题,换成ojdbc16.jar。 或者是检 ... -
String[] args = new String[]{sql.toString()}
2011-06-29 16:12 1102本题中 StringBuffer sql = new Stri ... -
to_date
2011-06-29 15:25 1391TO_DATE格式(以时间:2007-11 ... -
获取数据库当前时间
2011-06-22 10:35 1279例如有表table,table 中有两个字段:name 、 ... -
统计oracle 数据库 lawpeople表lawtype字段多个值只统计一次问题,按照地区分类
2011-06-10 15:57 1199select temparea.name,(case whe ... -
telephone页面传值到struts2模型驱动中报错
2011-05-22 19:42 1242- Error setting expression 'res ... -
oracle根据id查询数据时候in后面数目不能超过1000但是or可以
2011-05-04 15:13 1186select * from table where id i ...
相关推荐
考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法。在插入操作运行时,会造成系统短暂的“卡死”现象。为了让用户知道插入的状态,需要制作一个进度条来显示插入的进度。 批量插入 项目中...
mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入
使用C#自带SqlBulkcopy类,批量插入数据库,与一般insert into 插入效率相比,插入速度一个天一个地,效果很明显。特别用在导入大量数据时。
C#实现的批量插入sqlserver数据,使用三种方法,可以看出效率高低,insert是效率最低,sqlbulkcopy和表值参数效率很高且两者效率相当。
使用C#自带SqlBulkcopy类,批量插入数据库,与一般insert into 插入效率相比,插入速度一个天一个地,效果很明显。特别用在导入大量数据时。
本篇,我将来讲解一下在Sqlserver中批量插入数据。 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引。GUID必然是比自增长要快的,因为你生成一个GUID算法所花的...
C#写的大数据量批量快速效率高校的导入。 反正不是一条一条的插入 是一个dataset一个的插入 不管是C#还是JAVA 都用的上
技术方案二:由于是考虑到大数据量的批量插入,于是我想到了ADO.NET2.0的一个新的特性:SqlBulkCopy。有关这个的性能,很早之前我是亲自做过性能测试的,效率非常高。这也是我向公司同事推荐的技术方案。技术方案三...
解决kettle使用表输出到hive2时,批量提交不起作用导致速度非常慢的问题,重新编译big-data-plugin插件使表输出支持对hive2批量提交,速度由几十条每秒提升到三千条每秒。
MyBatis批量插入,效率经测试,1000条数据,批量插入和单条插入,执行效率至少快一倍,送上源码,供参考学习
本篇,我将来讲解一下在Sqlserver中批量插入数据。 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引。GUID必然是比自增长要快的,因为你生成一个GUID算法所花的...
一般情况下,我们录入都是一条一条的,但信息量较大的时候,就需要批量插入数据了,我们可以先读取外部指定格式的文件,然后将数据转换为可插入的格式,然后使用insert批量向数据库中插入数据,有效提升工作效率。...
主要介绍了C++操作MySQL大量数据插入效率低下的解决方法,需要的朋友可以参考下
在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题。下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-...
android中SQLite数据库中用insert同时插入多条记录的方法和效率比较
复制代码 代码如下:$sub_form = ... //使用事物批量导入有助于提高插入效率 $callStartTime = microtime(true); $this->db->trans_start(); foreach ( $form_datas as $item ) { $loop ++; $sub_form[] = $item
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。这篇文章主要介绍了mybatis中批量插入的两种方式(高效插入)的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
第一种: begin insert into tableName(column1, column2, column3...) values(value1,value2,value3...); insert into tableName(column1, column2, column3...) values(value1,value2,value3...);...
java快速插入千万级数据,亲测91秒插入1700万数据!!!