博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server-聚焦ROW_NUMBER VS TOP N性能
阅读量:7044 次
发布时间:2019-06-28

本文共 1492 字,大约阅读时间需要 4 分钟。

原文:

前言

抱歉各位,从八月份开始一直在着手写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 QUERYSELECT ProductIDFROM (    SELECT ProductID, ROW_NUMBER() OVER (ORDER BY ProductID) AS RN    FROM Production.Product    ) AS TWHERE T.RN <= 100GO-- TOP N QUERYSELECT     TOP 100 ProductIDFROM Production.ProductORDER BY ProductIDGO

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

 

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

DBCC DROPCLEANBUFFERS()DBCC FREEPROCCACHE()GOSET STATISTICS IO ONSET STATISTICS TIME ON--ROW_NUMBER QUERYSELECT ProductIDFROM (    SELECT ProductID, ROW_NUMBER() OVER (ORDER BY ProductID) AS RN    FROM Production.Product    ) AS TWHERE T.RN <= 1000GO-- TOP N QUERYSELECT     TOP 1000 ProductIDFROM Production.ProductORDER BY ProductIDGO

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

 

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

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

总结

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

转载地址:http://kazol.baihongyu.com/

你可能感兴趣的文章
如何制作iso文件
查看>>
构建openssl debug版
查看>>
jquery 的datatables插件问题
查看>>
Putty密钥(PrivateKey)导入SecureCRT
查看>>
移动环境下DNS解析失败后的优化方案
查看>>
TeeChart的最小步长和最大步长
查看>>
spring+springMVC中使用@Transcational方式管理事务的必须要配的东西。
查看>>
网络全民创业:95%电商生活得非常痛苦
查看>>
三种方法写监听事件
查看>>
hdu 2899 hdu 3400 三分/几何
查看>>
[转]World Wind学习总结一
查看>>
算法题一道
查看>>
滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(4月14日)...
查看>>
iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)
查看>>
C# Struct结构体里数组长度的指定
查看>>
感知机原理小结
查看>>
Java动态代理与Cglib库
查看>>
系统性能不够原因可能是cpu不够,内存不够等等
查看>>
让div在另一个div中居中
查看>>
Linux indent
查看>>