数据库分区表关联



数据库表分区

场景: 现实业务中有两个表关系比较紧密,而且数据量比较大的时候,需要对两个表都进行分区,并能很好的发挥分表作用

创建分区数据库表

注意: 数据库表最好是在创建的时候就进行分区,不能对已经创建的普通表(堆表)再进行分区变为分区表,否则转换起来比较麻烦。

create table OCS_COLLECT_PEOPLE
(
  COLLECT_ID      VARCHAR2(32) not null,
  PEOPLE_ID       VARCHAR2(20) not null,
  PEOPLE_VERSION  NUMBER(2) not null,
  ACCOUNT_VERSION NUMBER(2),
  PROJECT_ID      VARCHAR2(20) not null,
  REGION_ID       VARCHAR2(12) not null,
  BATCH_ID        VARCHAR2(32) not null,
  MONEY           NUMBER(12,3) not null,
  OPERATOR_ID     VARCHAR2(16) not null,
  OPERATOR_TIME   DATE not null,
  ASSIGN_ID       VARCHAR2(30),
  AUDIT_ID        VARCHAR2(25),
  PAY_ID          VARCHAR2(30),
  STATUS          NUMBER(2) not null
) PARTITION BY RANGE(OPERATOR_TIME)
(
PARTITION CP_2012 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD')) tablespace XT_TEST_P1,
PARTITION CP_2013 VALUES LESS THAN (TO_DATE('2014-01-01','YYYY-MM-DD')) tablespace XT_TEST_P2
);



create table OCS_COLLECT_PEOPLE_PROP
(
  COLLECT_ID  VARCHAR2(32) not null,
  FLOAT_VALUE NUMBER(12,3),
  INT_VALUE   INTEGER,
  STR_VALUE   VARCHAR2(100),
  DATE_VALUE  DATE,
  PROP_NAME   VARCHAR2(20) not null,
  OPERATOR_TIME   DATE not null
) PARTITION BY RANGE(OPERATOR_TIME)
(
PARTITION CPP_2012 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD')) tablespace XT_TEST_P1,
PARTITION CPP_2013 VALUES LESS THAN (TO_DATE('2014-01-01','YYYY-MM-DD')) tablespace XT_TEST_P2
);

使用比较

结论: 如果想使用两个表的分区功能,必须把两个表的分区字段使用上,才能达到最好效果,如果只使用一个表的分区字段,那么有一个表会使用分区优势,如下:

SELECT * FROM OCS_COLLECT_PEOPLE P,OCS_COLLECT_PEOPLE_PROP PP 
WHERE PP.OPERATOR_TIME=P.OPERATOR_TIME AND P.COLLECT_ID=PP.COLLECT_ID
 AND P.OPERATOR_TIME>TO_DATE('2013-01-01','YYYY-MM-DD');
--比下面的SQL好,从执行计划上看cardinality值和bytes值都小了许多SELECT * FROM OCS_COLLECT_PEOPLE P,OCS_COLLECT_PEOPLE_PROP PP 
WHERE PP.OPERATOR_TIME>TO_DATE('2013-01-01','YYYY-MM-DD'AND P.COLLECT_ID=PP.COLLECT_ID
 AND P.OPERATOR_TIME>TO_DATE('2013-01-01','YYYY-MM-DD')

数据库表分区

场景: 现实业务中有两个表关系比较紧密,而且数据量比较大的时候,需要对两个表都进行分区,并能很好的发挥分表作用

创建分区数据库表

注意: 数据库表最好是在创建的时候就进行分区,不能对已经创建的普通表(堆表)再进行分区变为分区表,否则转换起来比较麻烦。

create table OCS_COLLECT_PEOPLE
(
  COLLECT_ID      VARCHAR2(32) not null,
  PEOPLE_ID       VARCHAR2(20) not null,
  PEOPLE_VERSION  NUMBER(2) not null,
  ACCOUNT_VERSION NUMBER(2),
  PROJECT_ID      VARCHAR2(20) not null,
  REGION_ID       VARCHAR2(12) not null,
  BATCH_ID        VARCHAR2(32) not null,
  MONEY           NUMBER(12,3) not null,
  OPERATOR_ID     VARCHAR2(16) not null,
  OPERATOR_TIME   DATE not null,
  ASSIGN_ID       VARCHAR2(30),
  AUDIT_ID        VARCHAR2(25),
  PAY_ID          VARCHAR2(30),
  STATUS          NUMBER(2) not null
) PARTITION BY RANGE(OPERATOR_TIME)
(
PARTITION CP_2012 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD')) tablespace XT_TEST_P1,
PARTITION CP_2013 VALUES LESS THAN (TO_DATE('2014-01-01','YYYY-MM-DD')) tablespace XT_TEST_P2
);



create table OCS_COLLECT_PEOPLE_PROP
(
  COLLECT_ID  VARCHAR2(32) not null,
  FLOAT_VALUE NUMBER(12,3),
  INT_VALUE   INTEGER,
  STR_VALUE   VARCHAR2(100),
  DATE_VALUE  DATE,
  PROP_NAME   VARCHAR2(20) not null,
  OPERATOR_TIME   DATE not null
) PARTITION BY RANGE(OPERATOR_TIME)
(
PARTITION CPP_2012 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD')) tablespace XT_TEST_P1,
PARTITION CPP_2013 VALUES LESS THAN (TO_DATE('2014-01-01','YYYY-MM-DD')) tablespace XT_TEST_P2
);

使用比较

结论: 如果想使用两个表的分区功能,必须把两个表的分区字段使用上,才能达到最好效果,如果只使用一个表的分区字段,那么有一个表会使用分区优势,如下:

SELECT * FROM OCS_COLLECT_PEOPLE P,OCS_COLLECT_PEOPLE_PROP PP 
WHERE PP.OPERATOR_TIME=P.OPERATOR_TIME AND P.COLLECT_ID=PP.COLLECT_ID
 AND P.OPERATOR_TIME>TO_DATE('2013-01-01','YYYY-MM-DD');
--比下面的SQL好,从执行计划上看cardinality值和bytes值都小了许多SELECT * FROM OCS_COLLECT_PEOPLE P,OCS_COLLECT_PEOPLE_PROP PP 
WHERE PP.OPERATOR_TIME>TO_DATE('2013-01-01','YYYY-MM-DD'AND P.COLLECT_ID=PP.COLLECT_ID
 AND P.OPERATOR_TIME>TO_DATE('2013-01-01','YYYY-MM-DD')
### StarRocks 数据库中多表关联查询的优化与使用方法 在 StarRocks 中,多表关联查询是常见的操作场景之一。为了提升性能,可以采用以下策略: #### 1. **合理设计表结构** - 使用区和桶技术减少参与计算的数据量[^1]。 - 在多表关联时,确保关联字段具有相同的类型和长度,以避免隐式转换带来的额外开销。 - 示例代码: ```sql CREATE TABLE orders ( order_id BIGINT, customer_id BIGINT, order_date DATETIME ) DISTRIBUTED BY HASH(order_id) BUCKETS 10 PARTITION BY RANGE(order_date) ( PARTITION p202301 VALUES LESS THAN ('2023-02-01'), PARTITION p202302 VALUES LESS THAN ('2023-03-01') ); CREATE TABLE customers ( customer_id BIGINT, name STRING, address STRING ) DISTRIBUTED BY HASH(customer_id) BUCKETS 10; ``` #### 2. **利用 Runtime Filter 提升 JOIN 性能** - StarRocks 的 Runtime Filter 技术可以在运行时动态过滤掉不相关的数据,从而减少不必要的扫描和计算[^2]。 - 这种技术特别适用于小表驱动大表的场景,能够显著提升性能。 - 示例代码: ```sql SELECT o.order_id, c.name FROM orders o JOIN customers c ON o.customer_id = c.customer_id WHERE c.name LIKE 'John%'; ``` #### 3. **选择合适的 JOIN 类型** - 根据实际需求选择适合的 JOIN 类型(如 INNER JOIN、LEFT JOIN 等),并尽量避免全表扫描。 - 对于大规模数据集,优先考虑使用等值连接(Equi-Join),因为其性能通常优于非等值连接。 #### 4. **优化 SQL 查询** - 使用 `EXPLAIN` 析查询计划,找出潜在的瓶颈并进行调整[^1]。 - 尽量将过滤条件放在 WHERE 子句中,以便尽早减少数据量。 - 示例代码: ```sql EXPLAIN SELECT o.order_id, c.name FROM orders o JOIN customers c ON o.customer_id = c.customer_id WHERE c.name LIKE 'John%' AND o.order_date > '2023-01-01'; ``` #### 5. **调整系统参数** - 根据集群规模和查询特点,适当调整 StarRocks 的系统参数,例如 `query_mem_limit` 和 `max_bytes_per_broker_scanner`,以优化内存使用和扫描速度[^1]。 - 示例配置: ```properties query_mem_limit = 10GB max_bytes_per_broker_scanner = 512MB ``` #### 6. **使用物化视图** - 物化视图可以预先计算并存储关联结果,从而加速后续查询[^1]。 - 示例代码: ```sql CREATE MATERIALIZED VIEW mv_order_customer AS SELECT o.order_id, c.name FROM orders o JOIN customers c ON o.customer_id = c.customer_id; ``` #### 7. **结合布式计算能力** - 充利用 StarRocks 的 MPP 架构,通过编写高效的 SQL 查询来并行处理多表关联任务[^1]。 - 避免嵌套子查询或复杂函数,以减少计算开销。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值