sql-server – TABLESAMPLE返回错误的行数?

前端之家收集整理的这篇文章主要介绍了sql-server – TABLESAMPLE返回错误的行数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚发现了 TABLESAMPLE子句,但令人惊讶的是它没有返回我指定的行数.

我使用的表有~14M行,我想要一个10000行的任意样本.

select * from tabData TABLESAMPLE(10000 ROWS)

每次执行它(8000到14000之间),我得到的不是10000而是一个不同的数字.

这里发生了什么,我是否误解了TABLESAMPLE的预期目的?

编辑:

David’s link很好地解释了它.

这将以有效的方式返回10000个大致随机的行:

select TOP 10000 * from tabData TABLESAMPLE(20000 ROWS);

并且REPEATABLE选项有助于始终保持相同(除非数据已更改)

select TOP 10000 * from tabData TABLESAMPLE(10000 ROWS) REPEATABLE(100);

因为我想知道使用带有大量行的TABLESAMPLE来确保(?)我得到正确的行号是否更昂贵,我已经测量过了;

1.环(20次):

select TOP 10000 * from tabData TABLESAMPLE(10000 ROWS);

(9938 row(s) affected)
(10000 row(s) affected)
(9383 row(s) affected)
(9526 row(s) affected)
(10000 row(s) affected)
(9545 row(s) affected)
(9560 row(s) affected)
(9673 row(s) affected)
(9608 row(s) affected)
(9476 row(s) affected)
(9766 row(s) affected)
(10000 row(s) affected)
(9500 row(s) affected)
(9941 row(s) affected)
(9769 row(s) affected)
(9547 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(9478 row(s) affected)
First batch(only 10000 rows) completed in: 14 seconds!

2.loop(20次):

select TOP 10000 * from tabData TABLESAMPLE(10000000 ROWS);

(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
(10000 row(s) affected)
Second batch(max rows) completed in: 13 seconds!

3.loop:使用ORDER BY NEWID()进行100%随机行的反序验:

select TOP 10000 * from tabData ORDER BY NEWID();

(10000 row(s) affected)

在持续23分钟的一次执行后取消

结论:

令人惊讶的是,在TABLESAMPLE中使用精确的TOP子句和大量数字的方法并不慢.因此,它是ORDER BY NEWID()的一个非常有效的替代方法,如果行不是每行随机而是每页级别无关紧要(表的每个8K页面都给出一个随机值).

解决方法

请参阅 article here.您需要添加top子句和/或使用repeatable选项来获取所需的行数.

猜你在找的MsSQL相关文章