zoukankan      html  css  js  c++  java
  • sql语句(一)— —判断是否有这条数据的优化

    今天发现一个业务上的存储过程写的不够完善,和老板反应后,老板说你来完善吧,我:苦瓜脸~。说实话,我对SQL语句的熟练程度真的是不提也罢【捂脸】,大概的判断流程我知道,但是真的让我自己写,还真得上网查查相关资料。

    主要的业务逻辑是这样的,涉及到表A,表B。首先要根据传入的参数从表A里面获取到一个数据memberId,然后根据获取到的memberId到表B里面查询出这一条数据,并更新。

    问题:只是说找到这条数据更新,但是并没有做是否有这条数据的判断,所以我在执行存储过程的时候报错了。

    解决思路:先根据从表A里面获取到的memberId判断表B里是否存在这条数据,如果不存在,插入;如果存在,则更新。

    我是这么写的:如果数据数量特别多,几百万条甚至更多的话,要从头到尾都过一遍,很耗时间。

    declare @tCount int;
    select @tCount=COUNT(*) from dbo.Accounts where MemberId = @tMemberId
    if(@tCount=0)
        begin
            insert into dbo.Accounts values(@tBalance,@tMemberId)
        end

    我们老板提建议优化后的代码:我们的目的只是判断是否存在这条数据,完全可以用exists来判断是否存在,因为它一旦碰到符合条件的数据就不会往下执行了,比较节省时间和资源。

    1 if(not exists(select 1 from dbo.Accounts where MemberId = @tMemberId))
    2     begin
    3         insert into dbo.Accounts values(@tBalance,@tMemberId)
    4     end

    不管是写后台代码还是sql语句,都要在完成功能的同时考虑到优化,这样的代码才是经得住考验的。

    技术点滴,在于积累,继续坚持!

  • 相关阅读:
    kubernetes 节点数据彻底清理脚本
    多es 集群数据迁移方案
    .Net Framework各版本微软技术支持及到期日期
    etcd raft 处理流程图系列3-wal的读写
    etcd raft 处理流程图系列2-transport
    etcd raft 处理流程图系列1-raftexample
    一种分布式预写日志系统
    自适应软件缓存管理
    require/import路径中的叹号是什么?
    理解原型链
  • 原文地址:https://www.cnblogs.com/wsn1203/p/7205513.html
Copyright © 2011-2022 走看看