max与top的效率问题

mbh0210 2007-05-31 03:11:30
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的速度这么快?

...全文
1287 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪狼__ 2007-06-01
  • 打赏
  • 举报
回复
我用sql_server测试,MAX比TOP耗时
IT_zen 2007-06-01
  • 打赏
  • 举报
回复
鏄储寮曞紩璧风殑宸埆
rainstormed 2007-05-31
  • 打赏
  • 举报
回复
显然max要比top快的多了
max的复杂度是O(1)
top的复杂度是O(n) n为数据库的记录数
sp4 2007-05-31
  • 打赏
  • 举报
回复
我做了一下测试


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成本非常高。
这也就是说楼主的应用肯定应用不是索引字段(或该字段没有有效应用到索引)。
haoyuzhou009 2007-05-31
  • 打赏
  • 举报
回复
我用max比用top 1 要快1分钟
数据上100万了 就能深切体会max和top 1 的关系了
数据上200万的话max肯定能出来 top 1 不一定能出来
当然 我不是说简单的max与top 1
在各种各样的条件下。。。。。。。若干条件。。。。。。
gogocsgogodn 2007-05-31
  • 打赏
  • 举报
回复
sp4 2007-05-31
  • 打赏
  • 举报
回复
这个不好直接比较,要看执行计划才能确定是如何执行的,然后来区别为什么快。
因为对于某张表的查询,SQL会自己来做优化
mbh0210 2007-05-31
  • 打赏
  • 举报
回复
max应该是在第一次遍历的时候通过函数的比较取出最大值
而top 是在遍历第一次后然后在进行排序,然后取第一条,差别应该在这,而我之前说的max不是select top 1 num from table order by num desc 的函数吗?为什么max比top 1的速度这么快是错的
sevenmemory 2007-05-31
  • 打赏
  • 举报
回复
Max函数直接取最大值,不用管其他。select top 1 num from table order by num desc 要先按照大小降序排列,然後取第一個。你說哪個快?
---涛声依旧--- 2007-05-31
  • 打赏
  • 举报
回复
跟你的測試環境有關係
不同時間訪問該表的數量不一樣
最好在本地測試一下,沒有客戶端訪問的情況下進行測試才能說明問題
mbh0210 2007-05-31
  • 打赏
  • 举报
回复
楼上说的有道理,现在的问题是没有索引,为什么差距这么大?
---涛声依旧--- 2007-05-31
  • 打赏
  • 举报
回复
max不是select top 1 num from table order by num desc 的函数吗?
-----------------------------------------------------
樓主想當然吧
---涛声依旧--- 2007-05-31
  • 打赏
  • 举报
回复
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未建索引
如果你按主鍵排序的話,不一定比第一句慢
budong0000 2007-05-31
  • 打赏
  • 举报
回复
max , 你先搜出来VaryDate,再比较一次就ok.
top , 多了个sum的排序,然后再搜索出varydate的。。
mbh0210 2007-05-31
  • 打赏
  • 举报
回复
我用max比用top 1 要快1分钟
pol000 2007-05-31
  • 打赏
  • 举报
回复
为什么max比top 1的速度这么快?


MAX比TOP的快??
ondogdog 2007-05-31
  • 打赏
  • 举报
回复
因为max要计算的啊,top 1只是取它的第一条记录而已。
pol000 2007-05-31
  • 打赏
  • 举报
回复
不清楚 帮顶!
pol000 2007-05-31
  • 打赏
  • 举报
回复
sf

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧