首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

来源于新手关于分页效率的疑惑

2013-11-04 
来自新手关于分页效率的疑惑下面有两条查询语句都是查找数据表中第5 到第10条数据的,假设数据量很大,下面

来自新手关于分页效率的疑惑
下面有两条查询语句都是查找数据表中第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 次。

热点排行