--sql server 随机读取数据
SELECT TOP 1 * FROM [tablename] ORDER BY NEWID()
SELECT * FROM [tablename] where pk in (select top 1 pk from [tablename] ORDER BY NEWID())
--这两个方法都需要排序,因此IO的逻辑读取会比较多,而且CPU占用也多很多
select top 1 * from tbname TABLESAMPLE(XXX rows)
--XXX应该为整数,算法如下:
--按照你表的行大小,计算一个数据页大概装多少行,XXX最少为每页的行数,建议填为2-3倍每页行数
--如果不愿意去算这个数,也可以写成如下形式:
select top 1 * from tbname TABLESAMPLE(0.1 PERCENT)
--由于TABLESAMPLE选项只是读取整页的数据,因此即使是很大很大的表,读取几个页的速度还是很快的
--使用TABLESAMPLE选项,数据库随机取一个或者几个数据页,然后返回结果,不扫描索引,也不做全表扫描,也不排序。
--这个时候不要被执行计划所误导,执行计划写的是Table Scan.
--这个时候SET STATISTICS IO ON,你可以看到只有几个逻辑和物理读取
--结论:最后两种速度快,效率高