SQL Server-聚焦ROW_NUMBER VS TOP N性能

小说:江苏种植基地的红叶小檗便宜吗?作者:道平侯龙更新时间:2019-04-18字数:38696

来的是一名斥候,他急禀报道:“我们有弟兄在南面发现一支军队,大约三万人,距离我们只有五十里。”

直径15公分水杉树多少钱一棵?

在他们入场的同时,刚刚结束了一轮比赛的炽火学院队员们也正好从比赛场地走回来。唐三没有注意到他们,可炽火学院的众人却将目光落在了他们身上。尤其是火舞,第一时间就从史莱克学运战队中捕捉到了唐三的身影。
虽然人还是在「西文寺」,地点也不过从房间换到大厅,这样小的空间转换却让云岂拾、田开疆等人走了将近二十分钟,除了带领的寺僧,走在最前头的,不是云岂拾或田开疆,而是仇天恨,光从外表,很难看出仇天恨哪里不对,事实上,现在的仇天恨并不是仇天恨,真正的仇天恨正被困在他自己的躯体里面。

在那潜水器上安装着定位系统呢,他们可以很容易便是找到那个山洞。而且他们早就能够造出进入万米海底的潜水器了,再造出一个来也没什么问题。

前言

抱歉各位,从八月份开始一直在着手写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等来综合判断性能差异。

编辑:侯纯

发布:2019-04-18 19:29:58

当前文章:http://www.leetaemin.cn/play/efclmjamrl.html

绣球花是粉色的吗? 八角金盘杯苗哪里便宜? 地径10公分红枫树哪里有卖的? 紫玉兰是常绿的吗? 黄花藤本月季有什么品种? 卫矛最新报价哪里准确? 24种室内植物强力空气净化吸收PM2.5 云南有种植紫叶李的基地吗?

20391 74908 62823 56035 57708 56322 93647 70910 90646 65538 84248 64146 75277 76027 51657 26702 87336 99519 35594 90561

我要说两句: (0人参与)

发布