创建分区表、添加/删除/合并/拆分分区、查找分区名
蓝色底色的字为个人喜欢的名字,根据喜好进行修改
分区表
分区表是将一个大表划分为多个较小的部分,以提高查询性能和管理效率。分区表在逻辑上仍然是一张完整的表,但在物理上将数据存储在多个表空间中,从而加快数据查询速度。
表的行数超过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 分区

浙公网安备 33010602011771号