Company表中大约500万条数据,CompanyBought中大约5000条数据。
实现的都是分页
语句一执行时间小于1秒,语句二大约需要一分钟
语句一就是把语句二分成两条sql执行而已
为什么差别这么大呢?
请指点。
thanks语句一
declare @max int
set @max = (select max(CompanyId) from (select top 20 b.CompanyId from CompanyBought a JOIN Company b ON a.CompanyId = b.CompanyId order by b.CompanyId asc) as tblTmp) select top  20 b.CompanyId AS Id,b.Name from CompanyBought a JOIN Company b  
on a.CompanyId = b.CompanyId where b.CompanyId>@max
order by b.CompanyId asc语句二
select top 20 b.CompanyId AS Id,b.Name from CompanyBought a JOIN Company b 
on a.CompanyId = b.CompanyId where b.CompanyId>
(select max(CompanyId) from (select top 20 b.CompanyId from CompanyBought a JOIN Company b ON a.CompanyId = b.CompanyId order by b.CompanyId asc) as tblTmp) 
order by b.CompanyId asc

解决方案 »

  1.   

    第二个也是常量,ms sql 不知道优化一下啊
      

  2.   

    子查询就是b.CompanyId有多少个,就要执行多少次(select   max(CompanyId)   from   (select   top   20   b.CompanyId   from   CompanyBought   a   JOIN   Company   b   ON   a.CompanyId   =   b.CompanyId   order   by   b.CompanyId   asc)   as   tblTmp)
    所以很慢
      

  3.   

    为什么sql不对类似的东东做做优化呢?
      

  4.   

    不是SQL没有优化,而是要你去优化.
      

  5.   

    为什么对于一个表的又没什么差别呢?declare @max int
    set @max = (select max(CompanyId) from (select top 20 b.CompanyId from SG_AddOns_Company b order by b.CompanyId asc) as tblTmp) select top 20 b.CompanyId AS Id,b.Name from  SG_AddOns_Company b  where b.CompanyId>
    @max
    order by b.CompanyId ascselect top 20 b.CompanyId AS Id,b.Name from  SG_AddOns_Company b  where b.CompanyId>
    (select max(CompanyId) from (select top 20 b.CompanyId from SG_AddOns_Company b order by b.CompanyId asc) as tblTmp) 
    order by b.CompanyId asc
      

  6.   

    按道理这样的东东应该能优化得了,子查询只是独立的且返回一条记录.
    将子查询里的表别名改一改试试,改为与外面查询的别名完全不同.可能子查询里的表别名与外面查询的表别名相同, sql server搞不清它是否是独立的子查询.
      

  7.   

    为什么对于一个表的又没什么差别呢? declare   @max   int 
    set   @max   =   (select   max(CompanyId)   from   (select   top   20   b.CompanyId   from   SG_AddOns_Company   b   order   by   b.CompanyId   asc)   as   tblTmp)   select   top   20   b.CompanyId   AS   Id,b.Name   from     SG_AddOns_Company   b     where   b.CompanyId> 
    @max 
    order   by   b.CompanyId   asc select   top   20   b.CompanyId   AS   Id,b.Name   from     SG_AddOns_Company   b     where   b.CompanyId> 
    (select   max(CompanyId)   from   (select   top   20   b.CompanyId   from   SG_AddOns_Company   b   order   by   b.CompanyId   asc)   as   tblTmp)   
    order   by   b.CompanyId   asc
      

  8.   

    其实能否被优化,最关健的是让sql server知道你的子查询是一个独立的查询,如果sql server不能分析出你的子查询是独立的,对每条记录都会去运行你的子查询.你的语句的情况
    将你的子查询放于from 后面,应该可提高速度.
    将其改为:
    select       top       20       b.CompanyId       AS       Id,b.Name       
    from SG_AddOns_Company b ,
     (select  max(CompanyId) maxcompanyid
       from       (select top 20 b.CompanyId 
    from  SG_AddOns_Company b order by b.CompanyId asc) as  tblTmp)  c     where       b.CompanyId>c.maxcompanyid  
    order       by       b.CompanyId       asc
      

  9.   

    回楼上,都是一样   500万条记录
    ---------------------------
    那这就是一个比较有趣的情况了,估计SQL在使用一个表时要聪明一点,能够重用一些查询结果。
    具体的情况,你可以仔细看看两组查询的执行计划,就能看出差别。
      

  10.   

    回18楼 对于一个表,二者的效率差别不大 对于二个表的联接,差别很大是否将,子查询放到from 处,查询速度还是慢很多.
      

  11.   

    每次执行下边sql的时候都要执行这个(select   max(CompanyId)   from   (select   top   20   b.CompanyId   from   CompanyBought   a   JOIN   Company   b   ON   a.CompanyId   =   b.CompanyId   order   by   b.CompanyId   asc)   as   tblTmp)你看看这个要多少次查询,再结合前面的查询,你想累死谁啊
      

  12.   

    将索引去掉,在500Mhz的k6-2老机上试,第一个是20秒,第二个是1分50秒,
    执行第二个查询时,硬盘灯不停闪动.
    按理说,两查询应该是等价的,不知在大内存的情况下,会不会变好.