分享高性能批量插入和批量删除sql语句写法
    一,技术水平总能在扯皮和吹毛求疵中得到提高。如果从来不“求疵”,可能就不会知道if(str != )不如if(str != pty)高效、批量插入和删除的sql语句是要那样写才执行最快、接口和抽象类的区别不仅是语言层面、原来权限管理是要这样设计的、某个类那样设计职责才更单一更易于扩展……
    本来前两篇文章是学习cnblogs编辑控件用的,看到跟贴的朋友询问批量插入和批量删除的问题,决定整理成文和大家分享。
    我们这里讨论的只是普通sql语句如何写更高效,不考虑特殊的用文件中转等导入方式,毕竟在代码中调用sql语句或存储过程才更方便。
    批量删除很简单,大家可能都用过:
    delete from testtable where id in (1, 3, 54, 68)  --sql2005下运行通过  当用户在界面上不连续的选择多项进行删除时,该语句比循环调用多次删除或多条delete语句中间加分号一次调用等方法都高效的多。 
    本文重点讲述的是批量插入的写法:
    sql写法:
    insert into testtable select 1, abc union select  2, bcd  union select 3, cde--testtable表没有主键,id不是主键
    oracle写法:
    insert into testtable select 1, abc from daul union select  2, bcd from daul --testtable表没有主键,id不是主键
    曾经测试过,这种写法插入1000条数据比循环调用1000次insert或1000条insert语句简单叠加一次调用要高效得多,大概快20多倍(调试状态不是太准)。其实很简单,就用了个union(union all 也可以),但当时得出测试结果时还是很惊喜的。
    要得出这个结果需要两个条件:
    1、表不能有主键或者主键是数据库默认的(sql用自动递增列,oracle用序列)
    1
    以上两条任意一条不满足,效率的提高都不明显。
    另外,sql语句的最大长度有限制,组合几千条数据写成一条insert语句,可能会超过上限,所以如果有5000条数据,可以一次insert 1000条,分5次写完(不一定一次1000条最合适,有兴趣的朋友可以研究)。 
    声明:看了几位朋友的评论后发现自己没有叙述清楚
    上面的两个条件并不是说这样做就好,而是说当应用场景满足这两个条件时才适合用union的写法
    当时用这种写法时,是为了解决一个winform程序批量导入手机号码的问题,程序给自己人用,excel文件也是可靠的,不需要考虑sql攻击。还有一些场景是大量数据来源于通过gprs网络连接的专用终端,总之数据来源是可靠的,还有就是数据量很大但不可能巨大。 
    ps:常常遇到一些小技巧或者值得注意的小细节,没有记下来,要等下次再遇到时才想起来。现在下决心要养成好的工作习惯,留此文为证。
    能够整理成文的要写在项目组开发规范中,其它的至少要记录下来。 
    2
    二,使用mybatis将数据批量插入到oracle中,在映射文件中怎么写啊?
    1.mybaits版本,3.1.0
    2. 1.
    2.
bootstraptable初始化不加载数据    3.
    4.
electronic electric electrical
    5.
    6.
    7.  <!-- 批量插入 -->  <insert id=batchinsert parametertype=java.util.list>insert into b_agent_info(id,hkgs,username,custname,office,remark) values<foreach collection=list item=item index=index separator=,> (#{item.id},#{item.hkgs},#{item.username},#{item.custname},#{item
    .office},#{ark})
    8.
    9.</foreach>  </insert>
    这个是参考网上的写法写的不过不支持向oracle中批量插入!
    不知道有谁遇到过吗?或者给出解决方法,该怎么解决?
    ?
    到 一种 写法 分享 :
    <insert id=batchinsertb2b parametertype=arraylist>
    insert into
    xxxxtable(hkgs,hkgsjsda,office,asdf,ddd,ffff,supfullname,classtype,agent_type,remark)
    <foreach collection=list item=item index=index separator=union all> select #{item.hkgs,jdbctype=varchar},
    #{item.hkgsjsda,jdbctype=varchar},
    #{item.office,jdbctype=varchar},
    #{item.asdf,jdbctype=varchar},
    #{item.ddd,jdbctype=varchar},
    #{item.ffff,jdbctype=varchar},
    #{item.supfullname,jdbctype=varchar},0,0,
    #{ark,jdbctype=varchar} from dual
    </foreach>
    </insert>
    ?
    3
    可以考虑用union all来实现批量插入。
    例如:
    insert into xx_table(xx,xx,xx)select xx,xx,xx union all select xx,xx,xx union all select xx,xx,xx ...
    先拼装好语句再动态传入insert into xx_table(xx,xx,xx)后面部分,不知道能不能帮你解决问题 
数据加载失败请稍后重试
    4篇二:sql语句写法指导
    我们要做到不但会写sql,还要做到写出性能优良的sql语句。
    (1)选择最有效率的表名顺序(只在基于规则的优化器中有效):
    oracle的解析器按照从右到左的顺序处理from子句中的表名,from子句中写在最后的表(基础表 driving table)将被最先处理,在from子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。
    (2)where子句中的连接顺序:
    oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须写在其他where条件之前, 那些可以过滤掉最大数量记录的条件必须写在where子句的末尾。 中.国.站长站
    (3)select子句中避免使用‘*’:
    oracle在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
    (4)减少访问数据库的次数: 代码怎么编写圣诞树
    oracle在内部执行了许多工作: 解析sql语句, 估算索引的利用率, 绑定变量 , 读数据块等。
    (5)在sql*plus , sql*forms和pro*c中重新设置arraysize参数, 可以增加每次数据库访问的检索数据量 ,建议值为200。
mysql语句的执行顺序    (6)使用decode函数来减少处理时间:
    使用decode函数可以避免重复扫描相同记录或重复连接相同的表。
    (7)整合简单,无关联的数据库访问:
    如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)。
    (8)删除重复记录:
    最高效的删除重复记录方法 ( 因为使用了rowid)例子:
    delete from emp e wid > (select wid) from emp x where
    x.emp_no = e.emp_no);
    (9)用truncate替代delete:
    a. 回滚段上用于恢复数据的信息。
    b. 被程序语句获得的锁。 mousemove和mouseover
    d. oracle为管理上述3种资源中的内部花费。
    (11)用where子句替换having子句:
    避免使用having子句,having 只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序,总计等操作。如果能通过where子句限制记录的数目,那就能减少这方面的开销。(非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,
    因为它过滤数据后才进行sum,在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇写的工作流程,where的作用时间是在计算之前就完成的,而having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。