数据量太大,建议对phone列建立索引

解决方案 »

  1.   

    先全部插入到临时表,然后通过Leftjoin和空判断,把不存在的插入进去。
      

  2.   

    把phone 这个字段,按尾号做10个视图,0-9,这样每个视图基本百万级啦,视图其实就是查询好的SQL,占用物理内存
      

  3.   

    phone 建立一个索引。
    如果已经有索引列还这么慢。建议升级硬件或者分库。
      

  4.   

    如果要做比对,建议在入库前加一级缓存,
    可以使用Redis之类的NoSQL库
    内存操作总比数据库来得快
    缺点是耗内存
      

  5.   

    最起码地,判断是否存在记录,用 if exist(select * from ........ where .......) select 1 else select 0或者类似select top 1 from ..... where ......这样的形式,怎么能用 count 统计函数?谁教你的 sql 啊?
      

  6.   

    select top 1 from   ==》    select top 1 1 from
      

  7.   

    top 1 
      

  8.   

    你的数据应该分表管理了,   第二 你的SQL 是有问题的第一个写法 应该是
    if EXISTS (select * from 表 where phone='130xxxxxx')  
    begin
      update
    end
    else
    begin
      insert
    end
    第二种
    @@ROWCOUNT 返回受上一语句影响的行数
    UPDATE 表 SET creattime = 时间 WHERE phone='130xxxxxx'
    IF @@ROWCOUNT = 0
       insert剩下的你自己考虑吧, 这个只是语句的变化,  但是我觉得 对 SQL来说 千万条没啥事啊, 要不就是你电脑太烂了。
      

  9.   

    merge into
      

  10.   

    select top 1 1 FROM Cust(nolock)  where  phone='130xxxxxx'脏读 应该不死锁
      

  11.   

    直接插入不可以吗INSERT INTO Table select * FROM Cust a  where Not Exists (Select CustID From Cust b Where phone='130xxxxxx' and a.CustID=b.CustID)
      

  12.   

    再梳理下吧!
    1.能建索引就建索引!
    2.不要用count这种判断,用in或者exsits判断,内表比外表大或者两者大小差不多就用exsits判断!为什么这么写,底层逻辑自行百度!
      

  13.   

    我操,又漏了,如果是非值判断,那么永远用not exsits
      

  14.   

    上面说了,你可以加索引,使用 exists 代替 count。另外,执行高占用的任务,CPU 跑满也是很正常,毕竟机器的运算速度是有限的。如果只是不想 CPU 跑到 100%,可是在每次循环里面执行 Thread.Sleep 来控制 CPU 占用。