Sql数据库表结构(ID,strname)   每分钟接受到十几万条数据所要做的工作是,判断接受到得数据表中是否已存在,不存在则插入数据库。根据strname列判断(即接收到的数据插入数据库中且strname列没有重复项)怎样才能效率更高!?

解决方案 »

  1.   

    那就先select判断,但这个工作不要在接收的同步操作中,还是后天开线程做吧,接收放到内存,线程逐条处理
      

  2.   

    我现在用的方法是:通过select * from table where strname='***' 来判断数据是否存在不存在则插入感觉效率非常低
      

  3.   

    是否可以将多个name放在一起做查询,判断name是否存在,
    然后把不存在的都放在内存里,做批量插入。
      

  4.   

    我是通过select count(*) from Depro where comcode=‘***'判断是否存在
      

  5.   

    select * 似乎是最耗时的方式,换成select 主键 会好一些。
      

  6.   


    不能用主键,主键是ID,自增长的,传来的数据中不包含ID
      

  7.   


    你说的是这样??select ID from table where strname="***"
      

  8.   

    select count(ID) from table where strname="***"这样比较好
      

  9.   

    估计已经让ID做主键了吧,那就在strname上加一个非聚集索引(唯一)
    set nocount on
    select count(0) from table where strname = '***'其实,既然strname已经不允许重复了,个人感觉ID完全可以不必存在,直接拿strname做主键,除非刻意的为了保持某种兼容性。
      

  10.   

    数据库层面有个merge的方法可以考虑试试
      

  11.   

    MERGE 修改表 AS Target
    USING 数据表 as Source
    ON Target.UserName=Source.UserName
    WHEN MATCHED THEN UPDATE 
    SET Target.UserAge=Source.UserAge
    ,Target.UpdateTime=getdate()
    WHEN NOT MATCHED BY Target THEN 
    INSERT (UserName,UserAge,UpdateTime)
    VALUES(Source.UserName,Source.UserAge,getdate());
      

  12.   

    将strname设置为聚集索引,验证与写入用不同的线程,验证完成后需要将暂存到先进先出的消息列队(Queue),从这个列队读取写入.而验证时需要验证不存在于数据库中与不存在于这个列队.
      

  13.   


    用count(*)速度很慢   任何时候最好都不要把*列出来  上面这句你可以这样写 
    select 1 from Depro where comcode =‘***'
      

  14.   

    如果简单的批量插入,可以试试SqlBulkCopy
    如果要判断,估计还是得拼SQL语句(千万不要用SqlParameter),简单日志的话,每秒2000以上算是可以了。不过你这个数据比较简单,应该会高于2000
      

  15.   

    用缓存确实是最好的办法,那样就一定可以用SqlBulkCopy了
    关键是全部加载的数据量有多大
      

  16.   

    如果持久数据不重要,或者完全可以异步保存到你最终的数据库,那么使用个NoSQL作为另外一个数据库,先把数据扔到这里(使用strname作为对象的key),这也很快。
      

  17.   


    set statistics IO ON
    select count(*) from dbo.RequestUserInfo(1 行受影响)
    表 'RequestUserInfo'。扫描计数 3,逻辑读取 8780 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。set statistics IO ON
    select count(ID) from dbo.RequestUserInfo(1 行受影响)
    表 'RequestUserInfo'。扫描计数 3,逻辑读取 8780 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
      

  18.   

    建立一个唯一索引不就解决了?楼上这么多回答怎么没有想到这???
    只管插入记录,有索引重复自然就会抛出异常,catch一下就OK了