Tim*_*ter 10 t-sql sql-server sql-server-2005
我刚刚发现了这个TABLESAMPLE子句,但令人惊讶的是它没有返回我指定的行数.
我使用的表有~14M行,我想要一个10000行的任意样本.
select * from tabData TABLESAMPLE(10000 ROWS)
Run Code Online (Sandbox Code Playgroud)
每次执行它(8000到14000之间),我得到的不是10000而是不同的数字.
这里发生了什么,我误解了预期的目的TABLESAMPLE吗?
编辑:
大卫的链接很好地解释了它.
这将以有效的方式返回10000个大致随机的行:
select TOP 10000 * from tabData TABLESAMPLE(20000 ROWS);
Run Code Online (Sandbox Code Playgroud)
并且该REPEATABLE选项有助于始终保持相同(除非数据已更改)
select TOP 10000 * from tabData TABLESAMPLE(10000 ROWS) REPEATABLE(100);
Run Code Online (Sandbox Code Playgroud)
因为我想知道使用TABLESAMPLE大量行来确保(?)得到正确的行号是否更昂贵,我已经测量过了;
1.loop(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!
Run Code Online (Sandbox Code Playgroud)
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!
Run Code Online (Sandbox Code Playgroud)
3.loop:使用ORDER BY NEWID()进行100%随机行的反序验:
select TOP 10000 * from tabData ORDER BY NEWID();
(10000 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
在持续23分钟的一次执行后取消
结论:
所以,令人惊讶与一个确切的方法TOP条款,在大量TABLESAMPLE是不慢.因此,ORDER BY NEWID()如果行不是每行随机而是每页级别并不重要(表的每个8K页面都给出一个随机值),这是一种非常有效的替代方法.
| 归档时间: |
|
| 查看次数: |
5673 次 |
| 最近记录: |