MaxCompute分区表和非分区表使用对比

本文我们将通过对有同样数据量、表结构除分区列其他都一模一样的表,从查询计算、写入、删除数据几个简单操作进行对比,了解MaxCompute分区表和非分区表在使用上有什么差异。

在介绍之前,需要大家先了解MaxCompute分区的概念。

数据准备

分区表:取公共数据集中的表dwd_prouduct_house_basic_info_out(二手房产数据集);

非分区表:执行建表语句:

create table dwd_prouduct_house_basic_info_out_npt as select * from public_data.dwd_prouduct_house_basic_info_out;
    

创建表的同时将源表的所有数据都复制到新表dwd_prouduct_house_basic_info_out_npt中。
由于create table … as select … 语句创建的表不会复制分区属性,只会把源表的分区列作为目标表的一般列处理,所以新表dwd_prouduct_house_basic_info_out_npt为非分区表。

可以分别执行select count(*) from public_data.dwd_prouduct_house_basic_info_out;select count(*) from dwd_prouduct_house_basic_info_out_npt;查看这两个表的记录数会是一样。

本次操作表的记录数为1147676063条。

计算对比

我们执行一个简单的查询某个分区数据的job:

Select * from public_data.dwd_prouduct_house_basic_info_out where ds= '20170113';--分区表查询
Select * from dwd_prouduct_house_basic_info_out_npt where ds= '20170113';--非分区表查询

计算时长对比

计算资源充足的情况下进行操作。

  • 分区表里查询使用时间1秒,:

    ![image](https://yqfile.alicdn.com/f0b14b6c41c665568e53cff9ce2bf01fd29ae212.png)
    
    直接在对应分区中取出该分区所有数据。
    
  • 非分区里表查询:
    加上job等待时间共1分15秒
    ![image](https://yqfile.alicdn.com/470444f8b68cf80ce9d4e11e48f59a5b5f17c549.png)
    真正执行时长53秒
    ![image](https://yqfile.alicdn.com/cf8dfc1ef56a50b6be4eeda8055491cea96f9530.png)
    
    需要在整个表1147676063条记录中取出满足条件的数据。
    ![image](https://yqfile.alicdn.com/157dad8d5793761cbaa95e30d8cc340f23e0bccc.png)
    

计算费用对比

我们可以直接通过大数据开发套件->“数据开发”工作区中的“成本估计”对两条查询语句进行费用预估,该预估功能采用的计费公式可参考“[计量计费->I/O后付费](https://help.aliyun.com/document_detail/27989.html
)”。

若采用计算预付费模式,可不用在意该计算费用。

下图是通过成本估计功能预估的费用,结果显示在非分区表中查询一样条件的数据会花费更多,当然最终花费还得看最后的账单。

table size对比

由于MaxCompute存储压缩比不一定完全一致,两个表数据在MaxCompute的size也会有一定的差异。

desc public_data.dwd_prouduct_house_basic_info_out; 分区表执行结果如下图:

desc dwd_prouduct_house_basic_info_out_npt; 非分区表执行结果如下图:

写入对比

创建三个表,表结构除了分区列,其他都一致:

  • 非分区表,

    create  table   house_test_npt(house_id string  , house_total_price string , house_unit_price string , house_type string , house_floor string , house_direction string , house_deckoration string , house_area string , house_community_name string , house_region string  , house_city string, ds string)
    
  • 以时间为分区的分区表
    create  table   house_test_pt_1(house_id string  , house_total_price string , house_unit_price string , house_type string , house_floor string , house_direction string , house_deckoration string , house_area string , house_community_name string , house_region string  , house_city string ) partitioned by ( ds string)
    
  • 以时间为一级分区,城市为二级分区的分区表
    create  table   house_test_pt(house_id string  , house_total_price string , house_unit_price string , house_type string , house_floor string , house_direction string , house_deckoration string , house_area string , house_community_name string , house_region string ) partitioned by (ds string , house_city string)
    

分别执行3个insert语句,源表取一模一样的数据,即select分句一模一样:

insert overwrite table house_test_npt select house_id,house_total_price,house_unit_price,house_type,house_floor,house_direction,house_deckoration,house_area,house_community_name,house_region,house_city,ds from public_data.dwd_prouduct_house_basic_info_out where ds ='20170114';--写入非分区表

insert overwrite table house_test_pt_1 partition (ds='20170114') select house_id,house_total_price,house_unit_price,house_type,house_floor,house_direction,house_deckoration,house_area,house_community_name,house_region,house_city from public_data.dwd_prouduct_house_basic_info_out where ds ='20170114';--写入一级分区表

insert overwrite table house_test_pt partition (ds='20170114',house_city) select house_id,house_total_price,house_unit_price,house_type,house_floor,house_direction,house_deckoration,house_area,house_community_name,house_region,house_city from public_data.dwd_prouduct_house_basic_info_out where ds ='20170114';--使用动态分区方式写入二级分区表

对比执行过程:

  • 非分区表,一个task,耗时41s:

    ![image](https://yqfile.alicdn.com/d1ac9fe2ebcfc6c664a872a20490d937ffb2391a.png)
    
  • 一级分区表,一个task,耗时41s:
    ![image](https://yqfile.alicdn.com/6e3ef3aa8672220c78f7d5ca708a4784b9458011.png)
    
  • 二级分区表,第二级分区值为动态输入,2个task,最长task耗时1分31秒:
    ![image](https://yqfile.alicdn.com/359afdc276eb8b2d3552e79649204048a9309b2c.png)
    

数据删除操作对比

假设要删除表某一天的数据,由于MaxCompute不支持delete语法,我们需要通过别的方式进行数据删除。

  • 分区表只需要通过alter语句drop对应分区即可,如下删除分区为20170112的数据:

    ALTER TABLE public_data.ods_enterprise_share_basic DROP IF EXISTS PARTITION (ds='20170112');
    
  • 非分区表,需要将不需要删除的数据查询出来并覆盖写入方式写回表中,增加了计算量。
    INSERT OVERWRITE TABLE dwd_prouduct_house_basic_info_out_npt SELECT * FROM dwd_prouduct_house_basic_info_out_npt WHERE ds<>'20170112';
时间: 2024-11-10 00:53:53

MaxCompute分区表和非分区表使用对比的相关文章

非分区表是否可以创建分区索引?

有同事问一个问题, 一张非分区表,是否可以创建分区索引? 答案是可以,但分区索引的类型有限制. MOS这篇文章给出了答案,以及一些例子,What Is The Global Partitioned Index On Non Partitioned Table? (文档 ID 1612359.1). 依据文章中的示例,以下实验操作, 1. 创建测试表,TEST表有四条测试数据, 2. 首先创建全局哈希分区索引, 3. 创建全局范围分区索引, 3. 创建全局列表分区索引,报错ORA-14151,需要

oracle范围分区表和INTERVAL分区表对于SPLIT分区的区别

范围分区表和INTERVAL分区表是可以相互转化的,不过二者还是有所区别的.比如在SPLIT分区的时候,范围分区表没有限制,而INTERVAL分区表则可能报错. 首先看范围分区的例子: SQL> CREATE TABLE T_PART_RANGE 2  (ID NUMBER, 3  NAME VARCHAR2(30), 4  CREATE_DATE DATE) 5  PARTITION BY RANGE (CREATE_DATE) 6  (PARTITION P1 VALUES LESS THA

电脑如何将MBR分区表转换为GPT分区表

  在技巧方法开始之前,为防止大家一头雾水,咱们先来了解一下MBR和GPT都是什么吧! 全新硬盘没有经过格式化,安装操作系统之前,需要进行4K对齐分区,而硬盘分区初始化的两种格式,就是今天要说的MBR和GPT. MBR的全称是Master Boot Record(主引导记录),MBR早在1983年IBM PC DOS 2.0中就已经提出.之所以叫"主引导记录",是因为它是存在于驱动器开始部分的一个特殊的启动扇区.这个扇区包含了已安装的操作系统的启动加载器和驱动器的逻辑分区信息.它最大支

如何根据行号高效率的清除过期数据 - 非分区表,数据老化实践

标签 PostgreSQL , 数据老化 , 数据过期 , 行号 , array in , oss外部表 背景 数据按时间维度老化,删除或转移,是很多业务都有的需求. 例如业务的FEED数据,CDN的日志数据,物联网的跟踪数据等,有时间维度,可能再有状态值(标记最终状态). 阿里云RDS PG, HDB PG都对接了OSS存储,可以在OSS中存储冷数据. 我们可以将老化数据直接删除,也可以将老化数据删除并写入OSS外部表. 而假如我们的表是按老化字段分区的,那么我们可以通过DROP 分区表的方式

MaxCompute上如何处理非结构化数据

0. 前言 MaxCompute作为阿里云大数据平台的核心计算组件,拥有强大的计算能力,能够调度大量的节点做并行计算,同时对分布式计算中的failover,重试等均有一套行之有效的处理管理机制. 而MaxCompute SQL能在简明的语义上实现各种数据处理逻辑,在集团内外更是广为应用,在其上实现与各种数据源的互通,对于打通整个阿里云的数据生态具有重要意义.基于这一点,最近MaxCompute团队依托MaxCompute2.0系统架构,引入了非结构化数据处理框架:通过外部表,为各种数据在MaxC

MaxCompute与OSS非结构化数据读写互通(及图像处理实例)

0. 前言 MaxCompute作为阿里巴巴集团内部绝大多数大数据处理需求的核心计算组件,拥有强大的计算能力,随着集团内外大数据业务的不断扩展,新的数据使用场景也在不断产生.在这样的背景下,MaxCompute(ODPS)计算框架持续演化,而原来主要面对内部特殊格式数据的强大计算能力,也正在一步步的通过新增的非结构化数据处理框架,开放给不同的外部数据. 我们相信阿里巴巴集团的这种需求,也代表着业界大数据领域的最前沿实践和走向,具有相当的普适性.在之前我们已经对MaxCompute 2.0新增的非

oracle范围分区表和INTERVAL分区表的相互转化

INTERVAL分区其实是一种比较特殊的范围分区,因此可以很方便的将RANGE分区表转化为INTERVAL分区表,同样可以将INTERVAL分区表转化为RANGE分区表. 对于一个普通的范围分区表: SQL> CREATE TABLE T_PART 2  (ID NUMBER, 3  NAME VARCHAR2(30), 4  CREATE_DATE DATE) 5  PARTITION BY RANGE (ID) 6  (PARTITION P1 VALUES LESS THAN (100),

(原创)INTERVAL分区表与RANGE分区表相互转化

1.RANGE分区表转化为INTERVAL分区表 如果有MAXVALUE分区,则先删除,然后再用SET INTERVAL设置为自动分区间隔ALTER TABLE trdfat_profit DROP PARTITION P_MAX;ALTER TABLE trdfat_profit SET INTERVAL(1000000);ALTER TABLE trdfat_profit SET INTERVAL (NUMTODSINTERVAL(1,'DAY')) --NUMTODSINTERVAL常用的

分区表查询条件使用浅析

很多同学已经跨入了MaxCompute的殿堂,对分区表和非分区表有了初步了解,也充分意识到"大数据量"的信息表要尽可能的采用分区方式,因为这样在查询.统计.分析的时候,在WHERE条件中可以利用分区列进行过滤,从而提升查询效率,减少不必要的计算开销.有细心的同学就会将问题引申:如果有个分区表,分区列为A.B.C三列,我要查询B列为某些值的数据,MaxCompute还能充分发挥分区表的优势吗?答案是肯定的,MaxCompute依然能发挥分区列的优势!在底层解析SQL执行计划时,只会将符合