来自新手关于分页效率的疑惑
下面有两条查询语句都是查找数据表中第5 到第10条数据的,假设数据量很大,下面两条语句执行起来哪个效率会比较高?各有什么优缺点?
SELECT * FROM (SELECT (row_number() OVER (ORDER BY getdate ())) AS rownum,* FROM [DataTable]) t1 WHERE rownum BETWEEN 5 AND 10
SELECT TOP 5 * FROM T_Instrument WHERE id NOT IN (SELECT TOP 5 id FROM [DataTable])
貌似第一条子查询把整张表找出来筛选了,而第二条只把id列找出来筛选了,这样的理解对不对?
还有没不同的写法,效率如何?
欢迎指教!
方法1,用了1次聚集索引扫描,而方法2,用了2次聚集索引扫描,而且还用了嵌套循环连接,把2次扫描的结果集关联起来,所以并不是像你所说的,第二种not in的方法不会扫描,其实也好扫描的。
[解决办法]
通过输入set statistics io on 命令,我们可以看到,方法1是逻辑扫描2次,而方法2是扫描了22次,很明显,第2个方法的效率较差:
(5 行受影响)
表 'XX'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(5 行受影响)
表 'XX'。扫描计数 2,逻辑读取 22 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。