---
title: "表组 - OceanBase 数据库 V4.3.2 | OceanBase 文档中心"
description: 表组 在分布式 AP 系统中，表的数据量通常比较多。不同表的数据随机分布的情况下，表连接时的数据传输的开销往往不可忽视。合理的使用表组可以让分区方式相同的分区表数据按照特定的规则对齐，让具有关联关系的数据聚集在同一台机器上，使得这些表连接时能够使用 Partition Wise Join 的方式执行，能够有效降低连接…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.3.2

# 表组

更新时间：2024-08-20 23:00:00

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.3.2/zh-CN/620.obap/600.obap-query/600.obap-table-group.md)  

在分布式 AP 系统中，表的数据量通常比较多。不同表的数据随机分布的情况下，表连接时的数据传输的开销往往不可忽视。合理的使用表组可以让分区方式相同的分区表数据按照特定的规则对齐，让具有关联关系的数据聚集在同一台机器上，使得这些表连接时能够使用 Partition Wise Join 的方式执行，能够有效降低连接场景下的数据传输的开销，提升性能。

## 表组介绍

对于分布式数据库, 多个表中的数据可能会分布在不同的机器上, 这样在执行 Join 查询或跨表事务等复杂操作时就需要涉及跨机器的通信，而表组功能可以避免这种跨机器操作，从而提高数据库性能。

作为分布式数据库，为了满足扩展性和多点写入等需求，OceanBase 数据库支持分区功能，即将一个表的数据分成多个分区来存储。表中用来参与具体数据分区的列称为分区键，通过一行数据的分区键值，对其进行 Hash 计算（数据分区的方式有多种，这里以 Hash 分区为例），能够锁定其所属的分区。

让用户将分区方式相同的表聚集到一起就形成了表组（以 Hash 分区为例，分区方式相同等价于分区个数相同，当然计算分区的 Hash 算法也是一样的），表组内每个表的同号分区称为一个分区组，如下图所示。

![tablegroup](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer/kv/tablegroup.png)

OceanBase 数据库在分区创建以及之后可能发生的负载均衡时, 会将一个分区组的分区放到一个机器，这样即便存在跨表操作，只要操作数据所在的分区是属于同一个分区组，那么就不存在跨机器的操作。那么如何保障操作的数据在同一个分区组呢？OceanBase 数据库无法干涉用户的操作，但是可以根据业务特点大概率地保障某些操作涉及的跨表数据在同一分区组中。

## 使用示例一

创建一个 sharding 属性为 ADAPTIVE 的表组 tg1，和两个一级分区表 tbl1、tbl2。当两个分区表连接且连接条件中包含分区键的连接条件时，可以使用 Partition Wise Join 的方式提升性能。

```sql
CREATE TABLEGROUP tg1 SHARDING = 'ADAPTIVE';

CREATE TABLE tbl1 (id BIGINT PRIMARY KEY,  VARCHAR(50)) TABLEGROUP = tg1
PARTITION BY HASH(id) partitions 128;

CREATE TABLE tbl2 (id BIGINT, col1 VARCHAR(50)) TABLEGROUP = tg1
PARTITION BY HASH(id) partitions 128;

SELECT count(*)
FROM tbl1, tbl2
where tbl1.id = tbl2.id;

```

## 使用示例二

创建一个 sharding 属性为 ADAPTIVE 的表组 tg2，和两个二级分区表 tbl3、tbl4。当两个分区表连接且连接条件中包含分区键的连接条件时，可以使用 Partition Wise Join 的方式提升性能。

```sql
CREATE TABLEGROUP tg2 SHARDING = 'ADAPTIVE';

CREATE TABLE tbl3 (id BIGINT PRIMARY KEY, gmt_date datetime) TABLEGROUP = tg2
PARTITION BY RANGE(gmt_date)
SUBPARTITION BY HASH(id) subpartitions 128
(partition P202401 values less than(timestamp '2024-02-01 00:00:00'),
 partition P202402 values less than(timestamp '2024-03-01 00:00:00'),
 partition P202403 values less than(timestamp '2024-04-01 00:00:00'),
 partition P202401 values less than(timestamp '2024-05-01 00:00:00'),
 partition P202405 values less than(timestamp '2024-06-01 00:00:00'),
 partition P202406 values less than(timestamp '2024-07-01 00:00:00')
);

CREATE TABLE tbl4 (id BIGINT, gmt_date datetime) TABLEGROUP = tg2
PARTITION BY RANGE(gmt_date)
SUBPARTITION BY HASH(id) subpartitions 128
(partition P202401 values less than(timestamp '2024-02-01 00:00:00'),
 partition P202402 values less than(timestamp '2024-03-01 00:00:00'),
 partition P202403 values less than(timestamp '2024-04-01 00:00:00'),
 partition P202401 values less than(timestamp '2024-05-01 00:00:00'),
 partition P202405 values less than(timestamp '2024-06-01 00:00:00'),
 partition P202406 values less than(timestamp '2024-07-01 00:00:00')
);

SELECT count(*)
FROM tbl3, tbl4
where tbl3.id = tbl4.id
  and tbl3.gmt_date = tble4.gmt_date;

```

## 使用示例三

下面是 TPCH Q9 开启 AUTO DOP 后的执行计划，其中 PART、SUPPLIER、LINEITEM、PARTSUPP、ORDERS 是分区表并且在同一个表组中，NATION 不是分区表。由于表的定义比较长，这里就不展示表定义的具体写法了。

从执行计划中可以看到，PART（23 号算子）与 PARTSUPP（25 号算子）的连接（21号算子）及 ORDERS（29 号算子）与 LINEITEM（27 号算子）的连接（7 号算子）均采用了 Partition Wise Join 的方式。计划中可以很明显的看到这两个连接的左右支上不需要通过 EXCHANGE 算子进行数据传输，能够节省掉大量数据传输的开销。而 PARTSUPP（25 号算子）与 LINEITEM（27 号算子）的连接（17 号算子）没有采用 Partition Wise Join 的方式，虽然这两个表是在同一个表组内，但是由于两表的连接键不包含分区键，因此无法使用 Partition Wise Join 的方式节省数据传输的开销。

```
explain
SELECT /*+parallel(auto)*/ NATION,
                    O_YEAR,
                    SUM(AMOUNT) AS SUM_PROFIT
FROM
  (SELECT N_NAME AS NATION,
          DATE_FORMAT(O_ORDERDATE, '%Y') AS O_YEAR,
          L_EXTENDEDPRICE*(1-L_DISCOUNT)-PS_SUPPLYCOST*L_QUANTITY AS AMOUNT
   FROM PART,
        SUPPLIER,
        LINEITEM,
        PARTSUPP,
        ORDERS,
        NATION
   WHERE S_SUPPKEY = L_SUPPKEY
     AND PS_SUPPKEY= L_SUPPKEY
     AND PS_PARTKEY = L_PARTKEY
     AND P_PARTKEY= L_PARTKEY
     AND O_ORDERKEY = L_ORDERKEY
     AND S_NATIONKEY = N_NATIONKEY
     AND P_NAME LIKE '%%green%%') AS PROFIT
GROUP BY NATION,
         O_YEAR
ORDER BY NATION,
         O_YEAR DESC;

===========================================================================================
|ID|OPERATOR                                              |NAME    |EST.ROWS |EST.TIME(us)|
-------------------------------------------------------------------------------------------
|0 |PX COORDINATOR MERGE SORT                             |        |42833    |9793228     |
|1 |└─EXCHANGE OUT DISTR                                  |:EX10004|42833    |9761934     |
|2 |  └─SORT                                              |        |42833    |9758876     |
|3 |    └─HASH GROUP BY                                   |        |42833    |9757694     |
|4 |      └─EXCHANGE IN DISTR                             |        |985159   |9752609     |
|5 |        └─EXCHANGE OUT DISTR (HASH)                   |:EX10003|985159   |9721315     |
|6 |          └─HASH GROUP BY                             |        |985159   |9650996     |
|7 |            └─HASH JOIN                               |        |42590286 |9438413     |
|8 |              ├─SHARED HASH JOIN                      |        |40579279 |8156738     |
|9 |              │ ├─EXCHANGE IN DISTR                   |        |25       |26          |
|10|              │ │ └─EXCHANGE OUT DISTR (BC2HOST)      |:EX10000|25       |26          |
|11|              │ │   └─COLUMN TABLE FULL SCAN          |nation  |25       |5           |
|12|              │ └─SHARED HASH JOIN                    |        |40579279 |8006668     |
|13|              │   ├─EXCHANGE IN DISTR                 |        |1000000  |880987      |
|14|              │   │ └─EXCHANGE OUT DISTR (BC2HOST)    |:EX10001|1000000  |864431      |
|15|              │   │   └─PX PARTITION ITERATOR         |        |1000000  |10326       |
|16|              │   │     └─COLUMN TABLE FULL SCAN      |supplier|1000000  |10326       |
|17|              │   └─SHARED HASH JOIN                  |        |40579279 |6966307     |
|18|              │     ├─EXCHANGE IN DISTR               |        |5410229  |3596101     |
|19|              │     │ └─EXCHANGE OUT DISTR (BC2HOST)  |:EX10002|5410229  |3426468     |
|20|              │     │   └─PX PARTITION ITERATOR       |        |5410229  |504193      |
|21|              │     │     └─HASH JOIN                 |        |5410229  |504193      |
|22|              │     │       ├─JOIN FILTER CREATE      |:RF0000 |1355668  |326112      |
|23|              │     │       │ └─COLUMN TABLE FULL SCAN|part    |1355668  |326112      |
|24|              │     │       └─JOIN FILTER USE         |:RF0000 |5410660  |30374       |
|25|              │     │         └─COLUMN TABLE FULL SCAN|partsupp|5410660  |30374       |
|26|              │     └─PX PARTITION ITERATOR           |        |600037902|921105      |
|27|              │       └─COLUMN TABLE FULL SCAN        |lineitem|600037902|921105      |
|28|              └─PX PARTITION ITERATOR                 |        |150000000|76768       |
|29|                └─COLUMN TABLE FULL SCAN              |orders  |150000000|76768       |
===========================================================================================

```

## 相关文档

有关表组的详细介绍和使用，参见以下文档：

    MySQL 模式   Oracle 模式

- [关于表组](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052201)
 - [创建表组](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052198)
 - [查看表组信息](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052196)
 - [将表添加到表组](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052200)
 - [修改表组的 SHARDING 属性](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052197)
 - [管理表组内的表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052202)
 - [删除表组](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052199)

- [关于表组](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052130)
 - [创建表组](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052135)
 - [查看表组信息](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052133)
 - [将表添加到表组](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052131)
 - [修改表组的 SHARDING 属性](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052134)
 - [管理表组内的表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052129)
 - [删除表组](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001052132)

    上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
