这个问题太奇怪了,
我在SQL2005数据库中建立了两个查询  
Select * From A,B Where B like A +N'%'
Select a.HName ,a.Wordname From A, B like A +N'%'  
发现 前一查询速度比后一查询快很多倍. 后来发现原来 第一个查询在运行时会自动调用表A中存在的聚集索引, 但下面的查询在运行时却不会这样做。 后来我 试着把下面的查询显示字段一一减少来看那些字段时造成系统索引选择的重要原因。结果发现 HName,Wordname,Address,PinYin 这几个在A表中存在的字段全被显示出来时其速度和第一个查询相似, 少一个就不行。 这让我很惊讶,因为这几个字段只是A表中的普通字段(没建索引也不经常访问)为什么会对结果产生这么大的影响。
因为我只想得到字段HName,不想得到所有字段 不知该怎么做。 无论改为子查询还是别的方式,只要输出字段少于一定数目,查询结果一下就变的不能忍受。谁能说说原因及解决办法吗?

解决方案 »

  1.   

    您是要Join两个表把,没有on关键字的话,很容易产生歧义,请参考这个文章:http://blog.sina.com.cn/s/blog_7d2afc6c0100q3vk.html
      

  2.   

    Select * From A,B Where B like A +N'%' 这个是ANSI SQL-89的INNER JOIN内联接的语法。
    Select a.HName ,a.Wordname From A, B like A +N'%' 我怎么看像是CROSS JOIN。
    你可以试试Select a.HName ,a.Wordname From A, B where like A +N'%' 
      

  3.   

    我问的问题和连接语句无关, 主要是索引利用问题,我把上面语句改为下面连接
    Select * From A inner join B on B.HName like A.Hname +N'%'
    Select a.HName ,a.Wordname From A inner join B on b.HName like A.Hname +N'%' 
    结果一样,发现第一条语句速度很快,但第二条语句速度很慢。虽然我在HName字段上建立了索引,但是不能取得效果
      

  4.   

    2008+,在A的HName 上建立索引,include  Wordname 字段
      

  5.   

    要这样like来查询说明设计有不合理的地方
      

  6.   

    我的原意是从表A中找到以表B指定名称开始的ID,再根据找到的ID查看它还有那些其它可能名称。并和原来B表内容重新组合为新的内容。原查询为:
    Select A2.HName ,B.HName,A.Hname From AA as A1 ,AA as A2 inner join B on b.HName like A1.Hname +N'%'  where A1.ID=A2.ID
    后来发现速度非常慢。虽然我创建了针对HName和ID的索引.如果我把返回内容改为 Select * From ....则系统会迅速返回结果。两者差别非常大。 (AA表数据在6万左右,并不算大)
    后来发现在使用Select * 查询时系统会使用聚集索引,但返回指定内容时却要进行全表扫描