SQL Server 2005引进了一个新的特性TABLESAMPLE从现有的表中随机取出一些样本数据,既可以指定行数,

也可以指定百分比。如:
SELECT *
FROM Performance.dbo.Orders TABLESAMPLE (1000 ROWS);

 

SELECT *
FROM dbo.Orders TABLESAMPLE (0.1 PERCENT);

 

但是值得注意的是,并不代表精确地返回所指定的行数。因为随机选取的单位是数据页,
所以上面指定返回1000行,有可能返回800,900,1200都是有可能的。
如果需要指定准确的行数,可以先随机选取更多的数据,然后再利用TOP关键字,如:
SELECT TOP(1000) *
FROM dbo.Orders TABLESAMPLE (2000 ROWS);

如果需要返回同样的样本数据,使用REPEATABLE关键字,指定某一特定种子,那么
多次执行该条语句返回的样本数据都是一样的。如:
SELECT *
FROM dbo.Orders TABLESAMPLE (1000 ROWS) REPEATABLE(40);

 

TABLESAMPLE的具体算法
如A表有100行,有3个数据页,分别有数据 18,32,50。假设指定选取2行数据,系统首先会
计算出页面选取概率,算法为:2/100 = 1/50。很容易能计算出,该条语句不返回任何行的
概率为 (1 - 1/50) ^ 3  = 94%。返回18行的概率为 (1 - 1/50) * 1/50 * 1/50 =3.92%。同理
可算出其他。可见TABLESAMPLE不适宜选取少量数据。

如果需要选取少量数据,可用下面方法:
SELECT TOP(n) *
FROM dbo.Orders
ORDER BY NEWID();
注意:该种方法要慢很多。