时间:2021-07-01 10:21:17 帮助过:3人阅读
这条查询在我的电脑上执行了15S,这还是数据全在内存中的情形!如图1-1
图1-1
一个简单的执行计划执行如此之长有点匪夷所思,毕竟逻辑读才6W多,且无物理读
,而且CPU时间与占用时间相差无几,排除了阻塞之类的因素后我们把消耗定位在这个查询本身上.这时提一个Row_number()的特点,它可在万千数据中将其序列化让我们找到我们想要的精确数据点,但就此默认的实现方式上是为每一行数据都加一个行锁.
我们开启Trace Flag 1200再次执行语句捕捉下执行时的锁.可以看到Row_number()在实现上未进行锁升级如图1-2
Code
dbcc traceon(3604,1200,-1) select * from ( select ProductID, rn = ROW_NUMBER() OVER (ORDER BY ProductID) from [bigTransactionHistory] ) as t where t.rn between 15631801 and 15631802View Code