今天说一下 tablesample 这个东西

本文介绍了 SQL Server 中的 TableSample 抽样方法的使用方式,包括其基本语法、系统方法及其参数设置,并通过实验案例展示了如何在测试表中进行数据抽样。同时,解释了抽样过程的特性和返回数据的概率计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TableSample 平时用得少,基本上就是用于表里面抽样数据来看的。

用法如下

SELECT * FROM tbname TABLESAMPLE SYSTEM (N PERCENT/M Rows)  REPEATABLE()
TABLESAMPLE SYSTEM 这个表示使用System的方法进行数据抽样。(目前我也只知道有System这个方法)
N PERCENT/M Rows 可以选择抽样多少行,也可以抽样多少百分比
REPEATABLE 关键字里面还可以填入一个种子值,填充了之后每次可以得到一致的结果。
下面做实验,创建一个测试表
CREATE TABLE [dbo].[Tmp123]
(
[ID] [int] NOT NULL IDENTITY(1, 1),
[Col1] [char] (200) 
) ON [PRIMARY]
GO

塞进去500条数据

INSERT INTO dbo.Tmp123
        ( Col1 )
VALUES  ( 'abcd'  )

GO 500

大概看了一下下,DBCC IND('Test','Tmp123',-1) 占用了15个数据页,然后我们使用 tablesample 来进行抽样

SELECT * 
    FROM dbo.Tmp123 TABLESAMPLE (25 ROWS) 

这里执行之后发现。大概2次有1次没有返回任何数据,然而返回的数据也并不是准确的25条。

这就是TableSample 的特性,是因为sql server 会根据System方法随机决定是否要读取该数据页的数据进行显示,只能说,请求的行数越多,会越接近TableSample里面请求的行数。

那我们就可以进行一个变形

SELECT top 25 * 
    FROM dbo.Tmp123 TABLESAMPLE (25 ROWS) 

加上Top 去控制,那么得到的行,最多是25行,但是也会有少于25行的情况出现。so ……你懂的~

然后再说下我了解到的情况,为什么返回的几率是差不多一半一半呢?是这样纸的

1、这个表占用了15个数据页,总数据量是500条,我请求了25条 ,占比是  25/500 = 5% (是的,无论请求行数还是百分比,都会转换为百分比进行运算)

2、那么每个数据页的读取可能性就是 5% 了~一共15个数据页,其中没有结果返回的概率是  (1-5%)^15 = 43% ,差不多50%,所以调用的时候就觉得一半一半,样例越多越趋近这个结果

3、那如果现实的行比实际多,也是因为这个概率问题。如果表里面的数据越多,请求的行数越多,越接近请求的值。

4、如果真想精确的控制行数来实现随机,那么请用 

   

SELECT top 25 * 
    FROM dbo.Tmp123 
        ORDER BY NewID()

好~说完了~

 

转载于:https://www.cnblogs.com/Gin-23333/p/5182825.html

### PostgreSQL TABLESAMPLE Usage In PostgreSQL, `TABLESAMPLE` allows users to sample rows from tables efficiently without scanning the entire table. The syntax for using this clause involves specifying one of two methods: `BERNOULLI` or `SYSTEM`. Each method has distinct characteristics regarding how samples are selected. For instance, when applying Bernoulli sampling: ```sql SELECT * FROM employees TABLESAMPLE BERNOULLI (10); ``` Here, `(10)` indicates that approximately 10% of the rows will be sampled randomly based on row-level selection probability[^1]. Alternatively, system-based sampling operates differently by selecting blocks rather than individual records: ```sql SELECT * FROM employees TABLESAMPE SYSTEM (5); ``` The above command selects around 5% of disk pages containing data tuples, which may lead to more efficient performance but less precise representation compared with Bernoulli sampling[^2]. It's important to note that support for these features began officially after version 9.5 as part of ongoing enhancements within PostgreSQL development efforts[^3]. When working with large datasets where full scans might impact query execution times significantly, leveraging `TABLESAMPLE` provides a practical approach towards obtaining representative subsets quickly while reducing resource consumption. --related questions-- 1. How does block-level versus record-level sampling affect result accuracy? 2. What versions of PostgreSQL introduced official support for TABLESAMPLE functionality? 3. Can you provide scenarios illustrating optimal use cases for each type of sampling method?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值