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

本文共 1488 字,大约阅读时间需要 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://ydmla.baihongyu.com/

你可能感兴趣的文章
jdbc 简单连接
查看>>
Activiti 实战篇 小试牛刀
查看>>
java中的Static class
查看>>
[工具类]视频音频格式转换
查看>>
GNS3与抓包工具Wireshark的关联
查看>>
groovy-语句
查看>>
VIM寄存器使用
查看>>
Java VisualVM远程监控JVM
查看>>
nasm预处理器(2)
查看>>
二叉排序树 算法实验
查看>>
Silverlight 5 beta新特性探索系列:10.浏览器模式下内嵌HTML+浏览器模式下创建txt文本文件...
查看>>
YourSQLDba 配置——修改备份路径
查看>>
nginx web服务理论与实战
查看>>
java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码
查看>>
网易音乐版轮播-react组件版本
查看>>
ES6 - 函数与剩余运算符
查看>>
你对position了解有多深?看完这2道有意思的题你就有底了...
查看>>
WebSocket跨域问题解决
查看>>
ECMAScript6基本介绍
查看>>
世界经济论坛发布关于区块链网络安全的报告
查看>>