没有高并发,亿万级数据优化的基础sql二

     各位童鞋大家好,今天进行基础sql第二篇.上一篇说到oracle的 insert语句。可能少量出入oracle江湖的童鞋对它不熟悉,insert语句不是insert into mytable(xx, xx, xx...) values (ss, ss, ss...)么。不错,这也是oracle的insert语句,而且这是最基本,重要的语句。但是这条语句在有些复杂点的实际业务当中,并不能很好的解决问题。比如:有这么个需求场景,前期产生一个账单,都会对应生成一个账单对应记录保存到DB,但是因为各种原因,并不能保证每一条账单都能够准确无误的入库入表。这个时候可能就需要通过另个入口,或者日志进行补偿操作。补偿操作就必须要判断数据表里是否已经有了某条账单,有就不操作(或者会更新某些字段),无则要做新增操作。那么这时候上一篇的结尾语句就派上用场了。
     MERGE INTO my_table mt
         USING (SELECT id as id FROM dual) d2
         ON (mt.id = d2.id)
         /*WHEN MATCHED THEN
         UPDATE SET mt.name = 'myname', mt.age = 22*/
        WHEN NOT MATCHED THEN
        INSERT
            (id, name, age, mydife_time, created_time)
        VALUES
            ('seq', 'myname', 19, sysdate, sysdate);

     这条语句简单解释下,通过服务端传过来的id,匹配my_table表id,如果有符合相等条件匹配项,则可进行需要的更新操作。否则,进行insert操作。这样就能确保补偿操作都能顺利进行了。希望童鞋们都能够掌握这条sql语句,再遇到类似场景就能完美解决了。
     好了,基础的增,删,改,查语句都介绍完毕了。接下来继续看下面一条sql.
     insert all into mytable
     values
     (id, name, age, mydife_time, created_time)
     select A.*
     from (select xx, xx, xx, xx, xx from dual
          union all
          select xx, xx, xx, xx, xx  from dual .. .) A;
     select xx ... from dual 参数可通过服务端参数传入。
     insert all into 语句就是oracle 的批量插入语句了。批量插入的优点就是减少创建,关闭连接,减少提交次数从而很大程度提高sql执行效率。oracle批量插入sql语法设计很好记忆了,它与单条插入就是多了个 all关键字.所以童鞋们这条语句请掌握好,当你遇到大数据量业务时候,它也是经常出现的哦。
     为了便于童鞋们更好理解这条语句,我结合mybatis,完整的书写下这条语句,如下:
    
     INSERT ALL INTO my_table VALUES
             (id, name, age, mydife_time, created_time)
             select A.* from (
             <foreach collection="list" item="item" index="inde" separator="UNION ALL">
               select
               #{item.id, jdbcType=BIGINT} id,
               #{item.name, jdbcType=VARCHAR} name,
               #{item.age, jdbcType=VARCHAR} age,
               #{item.mydife_time, jdbcType=TIMESTAMP} mydife_time
               from dual
             </foreach>
             ) A
     关于批量插入sql,有些在数据层还是写一条insert into mytable(xx, xx, xx...) values (ss, ss, ss...)简单语句。服务端结合一些框架进行batchInsert操作,
当进行了insert一定量的时候(比如1000),直接通过程序进行提交操作。这样就能简化sql的写法。因本系列主要针对sql讲解,所以服务端程序方面不进行过多介绍.
     好了,通过2篇幅的介绍,已经把oracle insert常用语句介绍完毕,总共3种,一种是insert into ,一种是 insert all into ,一种是 merge into.他们的作用分别
是单条插入,批量插入,merge操作。在实际工作中,根据业务需求适当选择其中一种 insert语句。基本可以比较完美的解决绝大部分场景需求了。
     再看一种写法:
        begin
          insert into my_table(name, age, created_time, id)
          values('11111',123,sysdate,2);
          insert into my_table(name, age, created_time, id)
          values('22222',133,sysdate,3);
       end;
    begin,end;中间部分可以由服务端传入list进行迭代循环赋值。这样也可以进行批量新增操作。
    好了,这篇先到此吧。下一篇咱们聊聊update, 继续咱们基础的sql之旅吧!
   (不急,很快的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangzewu1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值