前言

抱歉各位,从八月份开始一直在着手写EntityFramework 6.x和EntityFramework Core 2.0的书籍写作,所以最近一直遗漏了对博客的管理,后面会着手于写SQL Server、EntityFramework Core和.NET Core方面的博客。我们知道如果需要查询前N行数据,除了可以利用TOP N进行查询外,同样也可以利用ROW_NUMBER来达到同样的效果,那么二者使用哪个性能会更好呢?下面我们来比较下。

ROW_NUMBER VS TOP N

我们利用AdventureWorks2012示例库中的Production.Product表来进行演示,如下:

DBCC DROPCLEANBUFFERS()
DBCC FREEPROCCACHE()
GO --ROW_NUMBER QUERY
SELECT ProductID
FROM (
SELECT ProductID, ROW_NUMBER() OVER (ORDER BY ProductID) AS RN
FROM Production.Product
) AS T
WHERE T.RN <= 100
GO -- TOP N QUERY
SELECT
TOP 100 ProductID
FROM Production.Product
ORDER BY ProductID
GO

如上图所知,对于这两个查询计划的成本是一样的,都为50%。 如果我们要检查在两个聚集索引扫描操作符中读取的估计行数,那么我们会注意到两者都显示相同的值,即100。可以说聚集索引扫描的估计和实际行数是相同的都是100,如下。

是不是就以此说明二者性能是一样的呢?稍等片刻,接下来我们将查询基数再设置大一点看看,比如1000而不再是100,如下:

DBCC DROPCLEANBUFFERS()
DBCC FREEPROCCACHE()
GO
SET STATISTICS IO ON
SET STATISTICS TIME ON
--ROW_NUMBER QUERY
SELECT ProductID
FROM (
SELECT ProductID, ROW_NUMBER() OVER (ORDER BY ProductID) AS RN
FROM Production.Product
) AS T
WHERE T.RN <= 1000
GO -- TOP N QUERY
SELECT
TOP 1000 ProductID
FROM Production.Product
ORDER BY ProductID
GO

从如上截图可以看出,使用ROW_NUMBER进行查询的速度要明显快于TOP N,即29%和71%。 但是,我们还需要在等一下,因为我们在这里看到的成本只是估计成本。 如果操作的估算不准确,那么查询计划估算成本也将不准确。 接下来我们检查两个计划中的聚集索引扫描的属性:

我们可以看到,使用ROW_NUMBER查询的估计行数为100,而实际数量为504,查询计划的估计成本是基于估计的行数所计算得来,即100。我们还是不能够相信估计的计划成本。 我们再来看看统计数据:

经过上面的统计,我们可以根据统计数据而做出最终决定,而不是比较执行计划的估计成本。TOP N的查询性能优于ROW_NUMBER。

总结

从上比较TOP N和ROW_NUMBER的查询得知,查询计划所得到的成本并不是判断性能的最终依据,只是基础性的判断,我们最终还得集合IO和TIME等来综合判断性能差异。

最新文章

  1. java分享第九天-01(抽象类)
  2. 双十二前夕爆京东12G数据泄露的真相是什么
  3. ARC中KVO开发注意
  4. C/C++学习笔记---高地址、低地址、大段字节序、小段字节序
  5. MINIX3 进程调度分析
  6. LAMP+Proftpd+数据迁移
  7. Java 中正确使用 hashCode 和 equals 方法
  8. IOS 学习笔记 2015-03-24 OC-API-不可变字符串
  9. Linux ln命令 - 建立文件/目录链接
  10. [转]iOS开发使用半透明模糊效果方法整理
  11. 【转】git 学习笔记( 随时更新中…… 最后更新日期201304281518)--不错
  12. hdu 4686 Arc of Dream(矩阵快速幂乘法)
  13. elya:给移动APP创业者的工具集(一)
  14. hibernate 多对多关系总结
  15. Linux-Centos7----安装Python的psutil模块插件
  16. urllib的实现---timeout,获取http响应码,重定向,proxy的设置
  17. PON
  18. 【转】用深度学习做crowd density estimation
  19. android kl文件
  20. cocos2d-x 3.0正式版 cmd创建project以及一键创建project

热门文章

  1. 我从.net转到java的心得和体会
  2. Orchard Core一分钟搭建ASP.NET Core CMS
  3. 基于树莓派的智能家居项目的设想与实现 Hestia
  4. 在VirtualBox 虚拟机中安装CentOS7 64位实验基础系统
  5. LSA和pLSA的比较
  6. 匿名HTTP透明HTTP高匿HTTP区别
  7. JDK1.7中HashMap底层实现原理
  8. 负载均衡之 nginx
  9. 【luogu P2002】消息扩散
  10. 关于xshell:Connection closed by foreign host