我有1000多万的数据,一个select * from table where fld like '%key%' 就半天不动了,一个Update语句也要命,我用WinForm的,大家谁有什么好建议??

解决方案 »

  1.   

    模糊查询索引用不上应该如何处理,目前我遇到一个情况就是批量更新大量数据,比如“update table ser fld='centent' where fld like '%this%' ”
      

  2.   

    这个是数据库问题,不是C#问题,你问错地方了,这里没人会帮你优化数据库结构。我的建议:1000万以上的表需要分表存储,将数据按照时间等条件拆分一个个子表。如果条件允许,更换Oracle数据库,千万级的数据最好用Oracle,SQLSERVER是跑不了的。Oracle下面还有分区存储功能,可以将一个表内的数据按照条件分区存储在各个不同的区域,以提高检索速度。
      

  3.   

    你的都是最低效率的查询,select * 和like,肯定慢对于查询,可以指明字段,加索引,分页查询,按条件查询,或异步查询当然数据库设计也很关键
      

  4.   

    like '%关键字%' 是用不上索引的。如果业务逻辑允许的话,改用like '关键字%'。
      

  5.   

    不要用*,把要查询的字段写全,fld加索引
      

  6.   

    更新不清楚 不过批量复制数据库sqlbulkcopy效率很高
      

  7.   


    你也太小看SqlServer了,现在的2008R2,可不比Oracle差多少,
    千万级的数据,SqlServer也是胜任有余,关键是你的结构是怎么设计的。要从你的业务逻辑入手哦。
      

  8.   

    update语句中的where条件也需要考察下。如果这里面牵涉到的字段索引不合理的话也会导致慢。
      

  9.   

    模糊查询根本用不上索引,不改变思路的话,加了也是白加。
    有一个办法可以用到索引(假如ID上有索引),通过模糊查询获取ID的范围,最大值和最小值,然后更新这个范围内的值。
    declare @MaxID int
    declare @MinID int
    select @MaxID=max(ID),@MinID=min(ID) from table where fld like '%this%' 
    update table ser fld='centent' where id between @MinID and @MaxID
      

  10.   

    对于like '%key%'这种模糊查询,貌似分表是个不错的选择。
      

  11.   

    如果可以的话,模糊查询可以用charindex或者patiindex函数来代替,效率要高点
    例如
    select * from table where charindex(key,fld)>0
      

  12.   

    这么大的数据量还用这些基础的Sql语句,那肯定会卡死在那里。楼主应该建索引
      

  13.   

    应该说Sql Server不比Oracle差,在某些方面比Oracle好
      

  14.   

    一般WinForm要链接数据库都怎么弄啊,以前Web是把连接串写到Web.Config里,现在有没有封装好的类啊
      

  15.   

    WInform有app.config,连接字符串可以写在里面
      

  16.   

    加索引,不要用全表检索 like  
      

  17.   

    要想交互性好,就用分页显示和分页更新的方式,试试ajex
      

  18.   

    like '%关键字%' 是用不上索引的。如果业务逻辑允许的话,改用like '关键字%'。
      

  19.   

    我试了一下用分页的代码模糊查询速度还可以,但是输入一个数据库没有的记录查询就超时了,语句是这样的:
    SELECT tt FROM (SELECT ROW_NUMBER() OVER (order by id) AS pos,tm FROM table where tt like '%"+textBox1.Text +"%') AS sp WHERE pos BETWEEN "+1+" AND "+20;