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为数据库的记录数