加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:19:12 所属栏目:MsSql教程 来源:网络整理
导读:我刚刚发现了 TABLESAMPLE 子句,但令人惊讶的是它没有返回我指定的行数. 我使用的表有~14M行,我想要一个10000行的任意样本. select * from tabData TABLESAMPLE(10000 ROWS) 每次执行它(8000到14000之间),我得到的不是10000而是一个不同的数字. 这里发生了什
我刚刚发现了 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选项来获取所需的行数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读