日期:2014-05-19  浏览次数:20656 次

max与top的效率问题
select   max   (   VaryDate   )     from   tbl_b_Projectinfo   p            
                    inner   join   tbl_b_sonItems   s   on   p.SubItemID   =   s.SubSupeID                 inner   join   ItemPrjVaryHistory   h   on   h.ItemPrjId   =   p.ProjectID   and   VaryType= '工程完工 '       where           s.supeid   =     @Supeid      




select   top   1   VaryDate       from   tbl_b_Projectinfo   p            
                    inner   join   tbl_b_sonItems   s   on   p.SubItemID   =   s.SubSupeID                 inner   join   ItemPrjVaryHistory   h   on   h.ItemPrjId   =   p.ProjectID   and   VaryType= '工程完工 '       where           s.supeid   =     @Supeid       order   by   VaryDate         desc   这两句sql的执行语句有一分钟的差距了

max不是select   top   1   num   from   table   order   by   num   desc   的函数吗?为什么max比top   1的速度这么快?



------解决方案--------------------
不清楚 帮顶!
------解决方案--------------------
max , 你先搜出来VaryDate,再比较一次就ok.
top , 多了个sum的排序,然后再搜索出varydate的。。
------解决方案--------------------
select top 1 VaryDate from tbl_b_Projectinfo p
inner join tbl_b_sonItems s on p.SubItemID = s.SubSupeID inner join ItemPrjVaryHistory h on h.ItemPrjId = p.ProjectID and VaryType= '工程完工 ' where s.supeid = @Supeid order by VaryDate desc 这两句sql的执行语句有一分钟的差距了
-------------------------------------------
那是因為你的VaryDate未建索引
如果你按主鍵排序的話,不一定比第一句慢
------解决方案--------------------
Max函数直接取最大值,不用管其他。select top 1 num from table order by num desc 要先按照大小降序排列,然後取第一個。你說哪個快?
------解决方案--------------------
这个不好直接比较,要看执行计划才能确定是如何执行的,然后来区别为什么快。
因为对于某张表的查询,SQL会自己来做优化
------解决方案--------------------

------解决方案--------------------
我用max比用top 1 要快1分钟
数据上100万了 就能深切体会max和top 1 的关系了
数据上200万的话max肯定能出来 top 1 不一定能出来
当然 我不是说简单的max与top 1
在各种各样的条件下。。。。。。。若干条件。。。。。。
------解决方案--------------------
我做了一下测试


select max(id) from table_pqs
select top 1 id from table_Pqs order by id desc

id为聚集索引或非聚集索引时,2者执行成本一致,也就是说消耗相同(虽然执行计划有差别)

id不是索引字段时,则执行的查询成本差距非常大max 远比 top 1 成本要低。
查看一下,就是top N sort成本非常高。
这也就是说楼主的应用肯定应用不是索引字段(或该字段没有有效应用到索引)。
------解决方案--------------------
显然max要比top快的多了
max的复杂度是O(1)
top的复杂度是O(n) n为数据库的记录数