我有一个表有800多万数据,里面有七八个字段,现在对于[Name]字段进行模糊查询,发现如果用like查询,很慢,用contains查询,返回的数据如果少,会快,多就会很慢,目前每个字段已经建立了索引
需求是在这里面找,如果返回的结果超过1000个,那就只取前1000个,否则有多少显示多少
数据分区有效果不?

解决方案 »

  1.   

      试试数据分区,然后用 union all 
      

  2.   

    分次合并查询
     
    --有点像分页,每次在固定的行数内查询
    --如果满足LIKE条件的数据行很多,而且集中在表的前面,则这种方法很快
    --如果满足LIKE条件的行数少於1000行或者都是集中表的后部,那么这种方法必须要遍历全表。SELECT TOP 1001 * INTO #tmp
    FROM (
          SELECT TOP 2000 * FROM TB 
         ) t
    WHERE [NAME] LIKE '%xxx%'
    IF @@ROWCOUNT<1000   --如果有必要这里可以做成WHILE循环  
    BEGIN
         ---进行下一次搜索
         INSERT INTO #tmp 
         SELECT TOP 1001 * 
         FROM (
              SELECT TOP 2000 * FROM TB WHERE 主键 Between 2001 AND 4001 
              ) t
         WHERE [NAME] LIKE '%xxx%'ENDSELECT * FROM #tmp
      

  3.   

    name 建立索引,当然如果只是name条件的话,以name建立索引即可。 否则 , 建立索引 name , …… 。 select * from table where name like '%***%'
      

  4.   

    目前每个字段已经建立了索引 
    --这种方式值得考究,
    --有必要在每个字段中建立索引么,你这个表是否会涉及到更新(包括新增和修改),
    --如果是这样的话,数据的更新速度怎样?
    --只需要对频繁查询的数据列建立索引即可,
    --如你的Name列,

    数据分区有效果不? 
    --800W,完全可以分区了,
    --分区的效果应该是很明显的,
    --否则,MS也不会花这么多精力把Oracle的分区表搬到SQL Server来.
      

  5.   

    使用SQL2005的数据表分区效果应该还可以
      

  6.   

    现在对于[Name]字段进行模糊查询索引做的好的话,是可以利用索引的