数据抽样(TABLESAMPLE)在数据处理方面经常用到,特别是当表数据量比较大时,随机查询表中一定数量记录的操作很常见,PostgreSQL早在9.5版时就已经提供了 TABLESAMPLE数据抽样功能,9.5版前通常通过ORDER BY random()方式实现数据抽样,这种方式虽然在功能上满足随机返回指定行数据,但性能很低。

create table test01(id integer, val char(1000)); insert into test01 values(generate_series(1,500000),repeat( chr(int4(random()*26)+65),1000));\timingEXPLAIN ANALYZE SELECT * FROM test01 ORDER BY random() LIMIT 1;

9.5版本以后PostgreSQL支持TABLESAMPLE数据抽样,语法如下所示:

SELECT ... FROM table_name TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ]

sampling_method指抽样方法,主要有两种:SYSTEM和 BERNOULLI

argument指抽样百分比。

注意 explain analyze命令表示实际执行这条SQL,同时显示SQL执行计划和执行时间,Planning time表示SQL语句解析生成执行计划的时间,Execution time表示SQL的实际执行时间。

SYSTEM抽样方式

SYSTEM抽样方式为随机抽取表上数据块上的数据,理论 上被抽样表的每个数据块被检索的概率是一样的,SYSTEM抽样方式基于数据块级别,后接抽样参数,被选中的块上的所有数据将被检索,下面使用示例进行说明。

CREATE TABLE test_sample(id int4,message text,create_time timestamp(6) without time zone default clock_timestamp()); INSERT INTO test_sample(id,message) SELECT n, md5(random()::text) FROM generate_series(1,1500000) n; SELECT * FROM test_sample LIMIT 1;

抽样因子设置成0.01,意味着返回1500000×0.01%=150条 记录,执行如下SQL:

EXPLAIN ANALYZE SELECT * FROM test_sample TABLESAMPLE SYSTEM(0.01);

以上执行计划主要有两点,一方面进行了Sample Scan扫描(抽样方式为SYSTEM),执行时间为0.178毫秒,性能较好,另一方面优化器预计访问150条记录,实际返回107条,为什么会返回107条记录呢?接着查看表占用的数据块数量,如下所示:

SELECT relname,relpages FROM pg_class WHERE relname='test_sample';

表test_sample物理上占用14019个数据块,也就是说每个数据块存储1000000/14019=107条记录。查看抽样数据的ctid,如下所示:

SELECT ctid,* FROM test_sample TABLESAMPLE SYSTEM(0.01); 

ctid是表的隐藏列,括号里的第一位表示逻辑数据块编号,第二位表示逻辑块上的数据的逻辑编号,从以上看出,这107条记录都存储在逻辑编号为5640的数据块上,也就是说抽样查询返回了一个数据块上的所有数据,抽样因子固定为0.01,多次执行以下查询,如下所示:

这也验证了SYSTEM抽样方式返回的数据以数据块为单位,被抽样的块上的所有数据被检索。

BERNOULLI抽样方式

BERNOULLI抽样方式随机抽取表的数据行,并返回指定百分比数据,BERNOULLI抽样方式基于数据行级别,理论上被抽样表的每行记录被检索的概率是一样的,因此BERNOULLI抽样方式抽取的数据相比SYSTEM抽样方式具有更好的随机性,但性能上相比SYSTEM抽样方式低很多,设置抽样方式为BERNOULLI,抽样因子为0.01。

EXPLAIN ANALYZE SELECT * FROM test_sample TABLESAMPLE BERNOULLI (0.01); 

从以上执行计划看出进行了Sample Scan扫描(抽样方式 为BERNOULLI),执行计划预计返回150条记录,实际返回147条,从返回的记录数来看,非常接近150条 (1000000×0.01%),但执行时间却要24.773毫秒,性能相比SYSTEM抽样方式差了很多。多次执行以下查询,查看返回记录数的变化,如下所示:

从以上看出,BERNOULLI抽样方式返回的数据量非常接近抽样数据的百分比,而SYSTEM抽样方式数据返回以数据块为单位,被抽样的块上的所有数据都被返回,因此SYSTEM抽样方式返回的数据量偏差较大。
由于BERNOULLI抽样基于数据行级别,猜想返回的数据应该位于不同的数据块上,通过查询表的ctid进行验证,如下所示:

SELECT ctid,id,message FROM test_sample TABLESAMPLE BERNOULLI(0.01) lIMIT 3;

从以上三条记录的ctid信息看出,三条数据分别位于数据块10、93、285上,因此BERNOULLI抽样方式随机性相比SYSTEM抽样方式更好。SYSTEM 抽样方式基于数据块级别,随机抽取表数据块上的记录,因此 这种方式抽取的记录的随机性不是很好,但返回的数据以数据块为单位,抽样性能很高,适用于抽样效率优先的场景,例如抽样大小为上百GB的日志表;而BERNOULLI抽样方式基于数 据行,相比SYSTEM抽样方式所抽样的数据随机性更好,但性能相比SYSTEM差很多,适用于抽样随机性优先的场景。

Postgresql的数据抽样相关推荐

  1. pandas数据预处理(标准化归一化、离散化/分箱/分桶、分类数据处理、时间类型数据处理、样本类别分布不均衡数据处理、数据抽样)

    1. 数值型数据的处理 1.1 标准化&归一化 数据标准化是一个常用的数据预处理操作,目的是处理不同规模和量纲的数据,使其缩放到相同的数据区间和范围,以减少规模.特征.分布差异等对模型的影响. ...

  2. Hadoop分布式环境下的数据抽样

    http://dongxicheng.org/data-mining/hadoop-sampling/ 1. 问题由来 Google曾经有一道非常经典的面试题: 给你一个长度为N的链表.N很大,但你不 ...

  3. MySQL 到PostgreSQL 的数据迁移工具

    2019独角兽企业重金招聘Python工程师标准>>> pg_chameleon is available on pypi for download python 包下载地址 The ...

  4. Debezium系列之:使用Debezium接入PostgreSQL数据库数据到Kafka集群的详细技术文档

    Debezium系列之:使用Debezium接入PostgreSQL数据库数据到Kafka集群的详细技术文档 一.概述 二.连接器的工作原理 1.安全 2.快照 3.Ad hoc snapshots ...

  5. PostgreSQL 时序数据案例 - 时间流逝, 自动压缩, 同比\环比

    标签 PostgreSQL , 时序数据 , rrd , rrdtool , round robin database , 自动压缩 , CTE , dml returning , 环比 , 同比 , ...

  6. python抽样_python数据预处理 :数据抽样解析

    何为数据抽样: 抽样是数据处理的一种基本方法,常常伴随着计算资源不足.获取全部数据困难.时效性要求等情况使用. 抽样方法: 一般有四种方法: 随机抽样 直接从整体数据中等概率抽取n个样本.这种方法优势 ...

  7. PostgreSQL 变化数据捕捉(CDC)

    PostgreSQL 变化数据捕捉(CDC) 基于CDC(变更数据捕捉)的增量数据集成总体步骤: 1.捕获源数据库中的更改数据 2.将变更的数据转换为您的消费者可以接受的格式 3.将数据发布到消费者或 ...

  8. POSTGRESQL TOAST 数据扩展存储技术原理与优势

    POSTGRESQL 的TOAST 功能是POSTGRESQL 本身提供对于可变长大字段的管理的方式. 讲此方面的的文章也是比较多的. 这里想提及的是,从TOAST 功能中对数据库系统设计的一种新的认 ...

  9. 关于PostgreSQL 插入数据时经常报错:no partition of relation found for row “tableName“ found for row (exec14 10

    关于PostgreSQL 插入数据时经常报错: Caused by: com.seaboxsql.util.PSQLException: ERROR: no partition of relation ...

最新文章

  1. 免费教材丨第47期:业界大牛中文教学视频《深度学习:进阶》第21-24讲
  2. 用外观判断论文好坏?这位顶会领域主席的论文被自己的AI审稿系统拒绝了
  3. PPT模板(淘宝花钱买来的,免费分享给大家)
  4. 用 Python 检验数据正态分布的几种方法
  5. mysql 唯一 标识符_mysql – 获取唯一标识符而不插入
  6. 信息林-青岛分类信息网.net源码
  7. 百度竞价点击器_同等预算,百度竞价托管如何让您的点击量高于您同行?
  8. 基于 TI 方案 CC2540 低功耗无线蓝牙模块详解
  9. Unity Shader 详细自学(一)
  10. SwiftUI+CoreData项目出现The operation couldn’t be completed(GenericObjCError error 0)错误的解决
  11. 2012-07《信息资源管理 02378》真卷解析,逐题解析+背诵技巧
  12. 2019个人目标——计划未来
  13. 计算机演示文稿实验报告,演示文稿实验报告.doc
  14. java 条形码_Java 生成、识别条形码
  15. 费马小定理及MR素数判断
  16. 微软xcloud服务器,微软公布云游戏服务Project xCloud详情 2019年公测
  17. 股市跷跷板—债券基金
  18. linux信号传递给进程,bash中的信号处理机制
  19. .NET Framework和.NET Core/.NET5/.NET6
  20. 【python绘图】——删除多余的图例【图示说明】

热门文章

  1. 直播软件开发:直播APP源码的重要程度
  2. 按键松手检测 - 检测是否连续按下
  3. 微拍堂冲刺港交所上市失效:多个核心数据下滑,林志明为大股东
  4. Linux服务器开发,Reids源码 主从同步与对象模型
  5. .pro文件生成.sln_VB.NET解决方案和项目文件“ sln”和“ vbproj”
  6. Qt入门教程【STL篇】STL分析
  7. 华为麦芒5云空间升级_华为麦芒5升级教程_华为麦芒5系统更新升级方法
  8. 什么样的人学习效果最差?
  9. sqlserver日期格式转换
  10. 被Epic Games收购后,Cubic Motion朝着面部实时捕捉技术继续迈进