现在情况是这样,用的sql 2005,有一张主表数据300多万,还有8张关联信息表每张大概不到1000万,通过一个主键(ID)相关联,现在要通过很多条件来进行检索,有在主表里直接检索的,还有很多要通过先查关联表查出主键范围,然后再通过主表的主键挑出这个范围的数据,特别是大部分都是“%关键词%”这样的模糊查询,每次查询实在是太慢了,还不算显示到Web端,建了索引似乎效果也不明显,谁有什么好的办法,分不够再加~!

解决方案 »

  1.   

    最好贴出表结构和一些数据实例以及你写的SQL
      

  2.   

    可以在查询语句后面加 OPTION(fast [记录数])强制要求sql server优先返回指定的记录数, 提前显示在web端.后面的记录慢慢执行,等用户端翻页再查看,应该问题不大.
      

  3.   

    就下面一个简单的查询吧,需要好几十秒钟
    select * from(SELECT    ROW_NUMBER() OVER (order by id) as pos, ID, SoftNo, SoftDate, SoftYear, PubNo, PubDate, PubYear, Title, Abstract, Claims, Address, ZipCode, Country, CountryCode, Province, ProvinceCode, 
                          Agency, Type, TransformOK, ErrorDesc
    FROM         Patent_Info
    WHERE     (Title LIKE '水泥制品的制造方法')) t
    where pos between 1 and 20 
      

  4.   

    你是为了查字典还是必须要跑完这100W?
    如果不是必须跑完这100W,那么可以用top 来限制.
    最近做了个查字典,str已经加了索引
    select * from dic where str like 'a%' 需要3秒
    select top 10 * from dic where str like 'a%' 需要0.1秒左右
      

  5.   

    你的 where pos between 1 and 20  
    完全可以用top 20來代替, 然後你在表數據多的時候,要在表名後面加 (nolock)
    你的like 后面沒有加 % ,那根本就沒必要用like還有,你的所有8張表,所有的聯合查詢的字段,都建立索引,這是必須的我現在操作的表數據有十幾張的表,數據量遠比你的大,幾千W的數據表也不少
    但是查詢數據都沒有說像你這么慢
      

  6.   

    like的话,索引是没有用的,会进行全表扫描的。可以考虑拆表,把数据拆分。分区表其实用处不大。如果需要查询的话,可以用全文索引,不过这个就用CONTAINS来查询,这个查询的时间是常量级的,非常快。具体的链接可以参考:http://www.cnblogs.com/dewin/archive/2009/12/18/1627244.html