http://topic.csdn.net/u/20080405/23/d104cd01-1ab9-4ceb-a131-768907a85ae0.html上面一贴可能我说的不够清楚,我重新整理了下,需求如下,请达人帮忙
select   top 15     *
from Client 
LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory AND CallHistory.IsValid = 1  
where 1=1 AND ((Client.FK_Center IN(61) OR CallHistory.FK_Center IN (61))  AND  Client.IsValid  =  1  ) --or严重影响效率Client --用户表 <100万>
Client.FK_Center --客户所就读的中心
CallHistory --客户访问记录  <80万>
CallHistory.FK_Center --客户访问过的中心(访问和就读的中心可能不一致)
现在的问题就是我想取用户就读的中心编号为61或者访问过中心编号为61的用户

解决方案 »

  1.   

    select top 15 * from Client 
    LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory
    where CallHistory.IsValid = 1 AND Client.IsValid = 1 AND (Client.FK_Center = 61 OR CallHistory.FK_Center = 61) 
      

  2.   

    1、or改为union all形式2、能不能直接=61?
      

  3.   

    看看有没有索引
    Client(FK_Center,IsValid) 
    和CallHistory(FK_Center,IsValid)没有加上试试
      

  4.   

    从另一贴看,你的sql远比这个复杂,也许其他表数据不多,但是也许可能影响查询计划的
      

  5.   


    (15 行受影响)
    表 'CallHistory'。扫描计数 94897,逻辑读取 304029 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'Client'。扫描计数 1,逻辑读取 22018 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次
    必须在连接之后再对数据做筛选,有什么好的办法解决呢FK_Center是聚集索引
      

  6.   

    试试:
    select   top 15  client.*
    from Client 
    LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory AND CallHistory.IsValid = 1  
    where 1=1 AND ((Client.FK_Center IN(61) OR CallHistory.FK_Center IN (61))  AND  Client.IsValid  =  1  )
      

  7.   


    --
    耗时 10秒表 'CallHistory'。扫描计数 3,逻辑读取 4878 次,物理读取 2 次,预读 4445 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'Client'。扫描计数 1,逻辑读取 92 次,物理读取 2 次,预读 18099 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。快了3秒左右,但CallHistory有些字段也是要取的
      

  8.   

    in(61) ?=> = 61 
      

  9.   

    重薪诚聘C++ 
    http://topic.csdn.net/u/20080227/14/8bce0844-bd15-42f0-9cda-a343d5d6601b.html 
      

  10.   

    既然没有排序,为什么要top 15呢?
    既然两表采用 或者 的形式,为什么要连接呢?从两表各读出记录,用联合,恐怕效率会高些.
      

  11.   


    有排序的,但被我省略了,top 15 --以上代码是我分页存储过程拼出的SQL
    既然两表采用 或者 的形式,为什么要连接呢? --不连接,怎么找出符合条件的所有学生啊我采用了 
    select top 15 * 
    from
    (
         select * from .... = 61
         union
         select * from .....=61
    )
    的方式,发现查询的效率还是很慢,翻一个页面要10多秒,客户不疯,我自己也要疯了,而且这个系统并发率很高,不敢想新建用户的时候会不会超时了。。
      

  12.   

    试下这样效果如何:
    select   top 15     *
    from Client 
    LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory AND CallHistory.IsValid = 1  
    where CallHistory.FK_Center IN (61)  AND  Client.IsValid  =  1   
    union all
    select  top 15     * 
    from client
    where Client.FK_Center IN(61) and Client.IsValid  =  1  
    另外(1)尽量不要用SELECT *,尽量只返回你需要的字段;(2)把能过滤掉数据越多的条件放在条件语句的越后面;
      

  13.   


    首先谢谢你的回复,但我发现2个select列数不等,给第二个select加上了连接,速度真的是很快只有2秒了,
    但union all会产品重复,改成union发现速度更慢了~~怎么办
      

  14.   

    CSDN应该增加删除自己恢复的功能
      

  15.   

    另外(1)尽量不要用SELECT *,尽量只返回你需要的字段; 用 数据库引擎优化顾问试试看他的建议见什么索引 会不会快一点阿
      

  16.   

    http://www.pudn.com/downloads65/sourcecode/app/detail235629.html http://www.pudn.com/downloads65/sourcecode/app/detail232174.html http://www.pudn.com/downloads69/sourcecode/app/detail246452.html http://www.pudn.com/downloads101/doc/detail414191.html http://www.pudn.com/downloads92/sourcecode/math/detail358721.html http://www.pudn.com/downloads36/sourcecode/math/detail112345.html 大家好,我现在要做毕业设计 
    有没有好心人有程序员联合开发网的账户和密码 
    帮我下载以下 
    不胜感激亚、 
    邮箱是[email protected] 
    谢谢亚
      

  17.   

    两个SELECT语句中不要用*,只取自己需要的字段,实在不清楚你client中的字段,不知道能不能满足你查询的结果,如果还需要其它字段,那第2个SELECT中还得连上其它表。至于你说的“但union all会产品重复,改成union发现速度更慢了~~怎么办”,你可以考虑试下下面模式,看能不能得到你要的结果(因为不知道你2个表中具体字段的情况,所以提供的只是个思路,不是正确的语句):
    select distinct a1,a2,a2
    from (
    select   top 15     *  
    from Client   
    LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory AND CallHistory.IsValid = 1    
    where CallHistory.FK_Center IN (61)  AND  Client.IsValid  =  1     
    union all  
    select  top 15     *   
    from client  
    where Client.FK_Center IN(61) and Client.IsValid  =  1  
    )
    查询中不要用union,用union all,大数据量时两者性能差很多。不过有重复,可以考虑用DISTINCT来过滤重复的,不过你要自己比较两种方法的性能