创建分区表、添加/删除/合并/拆分分区、查找分区名

蓝色底色的字为个人喜欢的名字,根据喜好进行修改

分区表

分区表是将一个大表划分为多个较小的部分,以提高查询性能和管理效率。分区表在逻辑上仍然是一张完整的表,但在物理上将数据存储在多个表空间中,从而加快数据查询速度。

表的行数超过5000万行以上或表大小超过50G 建分区表

分区表的优势:

1.提高查询性能(分区裁剪)

2.简化数据管理(分区独立管理)

3.优化存储资源(分区存储灵活)

4.支持大数据量和高并发场景

分区表的劣势:

1.增加设计和维护复杂性

2.索引管理成本较高

3.存储和元数据开销增加

4.不适合小数据量或不包含分区键的查询场景


普通表和分区表不能随意转化,分区表可以删除分区,但是至少剩下一个分区

分区表的类型:范围分区、间隔分区、列表分区、哈希分区、复合分区

范围分区:根据列值的范围进行分区,LESS THAN 不包含临界值

  CREATE TABLE username.test_range(id INT)

  PARTITION BY RANGE(id)

  (PARTITION partition_name1 VALUES LESS THAN (10),

  PARTITION partition_name2 VALUES LESS THAN (20),

  PARTITION partition_name3 VALUES LESS THAN (80))


间隔分区:属于范围分区的拓展,自动创建分区,适合数值类型和日期类型

  CREATE TABLE username.test_interval(id INT)

  PARTITION BY RANGE(id) INTERVAL(10)

  (PARTITION partition_name1 VALUES LESS THAN (10))


列表分区:通常针对字符串类型,适合重复率比较高的字符串类型

  CREATE TABLE username.test_list(id INT,sex VARCHAR2(10))

  PARTITION BY LIST(sex)

  (PARTITION partition_name1 VALUES ('man'),

  PARTITION partition_name2 VALUES ('woman'))


哈希分区:离散分布,通常针对数值类型,适合重复率比较低 比如主键,分区个数为2的N次方个为宜(做了解,不好用)

  CREATE TABLE username.test_hash(id INT PRIMARY KEY)

  PARTITION BY HASH(id)

  PARTITION(partition_name1,partition_name2,partition_name3,partition_name4)

哈希分区要写分区名,不用写分区内容


复合分区

  CREATE TABLE username.test_composite(id INT,sex VARCHAR2(10))

  PARTITION BY RANGE(id)

  SUBPARTITION BY LIST(sex)

  (

    PARTITION partition_name1 VALUES LESS THAN (10)

    (

      SUBPARTITION subpartition_name11 VALUES ('man'),

      SUBPARTITION subpartition_name12 VALUES ('woman')

    ),

    PARTITION partition_name2 VALUES LESS THAN (20)

    (

      SUBPARTITION subpartition_name21 VALUES ('man'),

      SUBPARTITION subpartition_name22 VALUES ('woman')

    ),

    PARTITION partition_name3 VALUES LESS THAN (MAXVALUE)

    (

      SUBPARTITION subpartition_name31 VALUES ('man'),

      SUBPARTITION subpartition_name32 VALUES ('woman'),

      SUBPARTITION subpartition_name33 VALUES (default)

    )

  )


 手动添加分区:添加的分区界限必须高于最后一个分区界限

  ALTER TABLE username.test_range ADD PARTITION partition_name4 VALUES LESS THAN (MAXVALUE)

  ALTER TABLE username.test_list ADD PARTITION partition_name3 VALUES (default)

删除分区/子分区:删除分区将会连同分区内的数据一并删除

  ALTER TABLE username.test_range DROP PARTITION partition_name4 

  ALTER TABLE username.test_composite DROP SUBPARTITION subpartition_name33

在系统表中查找分区/子分区名

  SELECT * FROM SYS.ALL_TAB_PARTITIONS WHERE TABLE_OWNER = UPPER('username') AND TABLE_NAME = UPPER('test_range') 

  SELECT * FROM SYS.ALL_TAB_SUBPARTITIONS WHERE TABLE_OWNER = UPPER('username') AND TABLE_NAME = UPPER('test_composite') 

合并分区

  ALTER TABLE username.test_range MERGE PARTITIONS partition_name1,partition_name2 INTO PARTITION partition_name10086

  把 username.test_range 表内的名字为 partition_name1 和名字为 partition_name2 的分区合并到名字为 partition_name10086 分区中

  ALTER TABLE username.test_list MERGE PARTITIONS partition_name1,partition_name2 INTO PARTITION partition_name10086

  把 username.test_list 表内的名字为 partition_name1 和名字为 partition_name2 的分区合并到名字为 partition_name10086 分区中

拆分分区

  ALTER TABLE  username.test_range SPLIT PARTITION partition_name10086 AT (10) INTO (PARTITION partition_name1,PARTITION partition_name2)

  把 username.test_range 表内的名字为 partition_name10086 的分区拆分根据 10 拆分为 LESS THAN 10 的到 partition_name1 分区,其余的到 partition_name2 分区

  ALTER TABLE  username.test_list SPLIT PARTITION partition_name10086 VALUES ('man') INTO (PARTITION partition_name1,PARTITION partition_name2)

  把 username.test_list 表内的名字为 partition_name10086 的分区拆分根据 'man' 拆分为是 man 的到 partition_name1 分区,其余的到 partition_name2 分区

 

posted @ 2025-06-04 10:14  wwwwxxxx  阅读(44)  评论(0)    收藏  举报