Sql Server2005中获取表中某一列的最大值使用MAX和TOP-ORDER BY执行效率比较
2009-07-14 11:39
435 查看
今天在CSDN看到这样的一个帖子,于是用SqlServer2005查询分析器测试了一下。
测试之前,我个人认为是MAX,测试之后发现是TOP-Order BY
要求:获取表中某一数值列的最大值
语句:
1)select top 1 Number from pager order by Number desc
2)select Max(Number) from pager
数据表:
1)Pager表,3列,20000行数据,其中ID是主键列、自增标识列,无其他索引
2)Pager2表,3列,20000行数据,其中ID是自增标识列,该表无主键列,无其他索引
执行:
1)使用Pager表 分别运行两条T-Sql语句4次
2)使用Pager2 表 分别运行两条T-Sql语句4次
下面开始:
1-1 Pager表: select top 1 Number from pager order by Number desc。下图中是使用主键列ID排序后的执行计划和客户端统计信息
执行计划
客户端统计信息
1-2 Pager表: select Max(Number) from pager
执行计划
客户端统计信息
2-1 Pager2表: select top 1 Number from pager2 order by Number desc
执行计划
客户端统计信息
2-2 Pager2表: select Max(Number) from pager2
执行计划
客户端统计信息
从这些数据结果来看:
1)使用Pager表,大数据量时Top-Order by语句的执行效率优势相当明显
2)使用Pager2表时, Top-Order by语句的执行效率依然有明显的优势
不当之处,欢迎指正!
-------------谢谢指正!
补充1): 在使用Pager表时,由于排序列使用了ID(主键),所以从数据上看效率很高;但实际排序列应该是Number,此时效率要降低不少。
其实,在做这个测试的时候,我是循环往表中Number列插入1到20000,所以在此表中ID列的排序也是Number列的正确排序结果,而效率更高。
而实际应用中并不一定这么巧合。
测试之前,我个人认为是MAX,测试之后发现是TOP-Order BY
要求:获取表中某一数值列的最大值
语句:
1)select top 1 Number from pager order by Number desc
2)select Max(Number) from pager
数据表:
1)Pager表,3列,20000行数据,其中ID是主键列、自增标识列,无其他索引
2)Pager2表,3列,20000行数据,其中ID是自增标识列,该表无主键列,无其他索引
执行:
1)使用Pager表 分别运行两条T-Sql语句4次
2)使用Pager2 表 分别运行两条T-Sql语句4次
下面开始:
1-1 Pager表: select top 1 Number from pager order by Number desc。下图中是使用主键列ID排序后的执行计划和客户端统计信息
执行计划
客户端统计信息
1-2 Pager表: select Max(Number) from pager
执行计划
客户端统计信息
2-1 Pager2表: select top 1 Number from pager2 order by Number desc
执行计划
客户端统计信息
2-2 Pager2表: select Max(Number) from pager2
执行计划
客户端统计信息
从这些数据结果来看:
1)使用Pager表,大数据量时Top-Order by语句的执行效率优势相当明显
2)使用Pager2表时, Top-Order by语句的执行效率依然有明显的优势
不当之处,欢迎指正!
-------------谢谢指正!
补充1): 在使用Pager表时,由于排序列使用了ID(主键),所以从数据上看效率很高;但实际排序列应该是Number,此时效率要降低不少。
其实,在做这个测试的时候,我是循环往表中Number列插入1到20000,所以在此表中ID列的排序也是Number列的正确排序结果,而效率更高。
而实际应用中并不一定这么巧合。
相关文章推荐
- 使用Hibernate获取最大值(max)的三种方法
- (ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较
- Python执行效率测试模块timei的使用方法与与常用Python用法的效率比较
- 使用Hibernate获取最大值(max)的三种方法
- javascript使用Array、join做字符存储和直接使用+号拼接字符串的执行效率比较
- 使用Hibernate获取最大值(max)的三种方法(转载)
- 使用Hibernate获取最大值(max)的三种方法
- Hibernate -- 使用Hibernate获取最大值(max)的三种方法(转)
- 使用Hibernate获取最大值(max)的三种方法
- 使用Hibernate获取最大值(max)的三种方法
- 使用FineUploader 上传大文件设置IIS7文件上传的最大大小 maxAllowedContentLength,maxRequestLength
- 错误提示之:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性
- 2014-04-30工作日志:提取文件的路径及使用createprocess时,要用getmodulename获取要执行的模块的路径及调用createprocess时要记得关闭新建的进程
- TOP子句和Order BY子句联合使用的时候,是先执行哪个?
- [转]超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
- C++实现获取某一类型最大值
- 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小
- 超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。
- 使用参数化和块语句来提高批处理SQL语句的执行效率