達夢數據庫分區
分區是指將表、索引等數據庫對象划分為較小的可管理片段的技術,一個表被分區后,對表的查詢操作可以局限於某個分區進行,而不是整個表,這樣可以大大提高查詢速度,在分區表中,子表跟主表具有相同的邏輯結構,主表本身不存儲數據,所有數據只存儲在子表中,從而實現不同分區的完全獨立性,可滿足企業高可用性、 均衡IO、降低維護成本、提高查詢性能的要求。分區主要包括范圍分區、哈希分區、列表分區和復合分區。按時間分區是現實生產中最主要的分區方式,本文主要講解這種分區方式。
創建范圍分區表
create table PART(tdate datetime,city varchar(50),income number(10,2))
PARTITION BY RANGE(tdate)
( PARTITION p2016 VALUES LESS THAN ('2017-01-01'),
PARTITION p2017 VALUES LESS THAN ('2018-01-01'),
PARTITION p2018 VALUES LESS THAN ('2019-01-01'),
PARTITION p2019 VALUES LESS THAN ('2020-01-01'),
PARTITION p_other VALUES LESS THAN (MAXVALUE)
);
創建存儲過程proc_part
CREATE OR REPLACE PROCEDURE proc_part AS
DECLARE
StartDate DATE:=DATE '2000-01-01';
begin
for i in 1..11000 loop
INSERT INTO PART (PART.TDATE,PART.CITY,PART.income)
SELECT
StartDate+i,
CITY.CITY_NAME,
convert(number(10,2),1000000*RAND())
from "DMHR"."CITY";
end loop;
commit;
end;
調用proc_part
call PROC_PART;
查看表分區數據
查看分區
select partition_name from dba_tab_partitions where table_name='PART';
交換分區
1新建交換表,表結構和分區表字段相同
create table PART2 as select * from PART where 1=2;
2 交換分區
ALTER TABLE PART EXCHANGE PARTITION p_other WITH TABLE PART2;
可以看到p_other分區數據已經到新建交換表中了
刪除分區
alter table PART drop partition p_other
增加分區
alter table PART add partition p2020 values less than('2021-01-01');
合並分區
alter table PART merge partitions p2016,p2017 into partition p20116_17;
拆分分區
alter table PART split partition p20116_17 at ('2017-01-01') into (partition p2016,partition p2017);
定時自動新增表分區
創建分區表
create table PART(tdate datetime,city varchar(50),income number(10,2))
PARTITION BY RANGE(tdate)
( PARTITION p_2016 VALUES LESS THAN ('2017-01-01'),
PARTITION p_2017 VALUES LESS THAN ('2018-01-01'),
PARTITION p_2018 VALUES LESS THAN ('2019-01-01'),
PARTITION p_2019 VALUES LESS THAN ('2020-01-01'),
PARTITION p_2020_01 VALUES LESS THAN ('2020-02-01'),
PARTITION p_2020_02 VALUES LESS THAN ('2020-03-01'),
PARTITION p_2020_03 VALUES LESS THAN ('2020-04-01'),
PARTITION p_2020_04 VALUES LESS THAN ('2020-05-01'),
PARTITION p_2020_05 VALUES LESS THAN ('2020-06-01'),
PARTITION p_2999 VALUES LESS THAN (MAXVALUE)
);
查看表分區信息
select partition_name from dba_tab_partitions where table_name='PART' order by 1 desc
按月份增加分區存儲過程
create or replace procedure addpartition(tname varchar(50)) is
declare
highvalue varchar(50);
partition_name varchar(50);
month_name varchar(2);
year_name varchar(4);
sSql varchar(2000);
dSql varchar(2000);
aSql varchar(2000);
begin
select substr(max(high_value),10,10) into highvalue from dba_tab_partitions where table_name=sTable_name and table_owner='SYSDBA' and HIGH_VALUE like 'DATETIME%';
year_name = datepart(year,highvalue);
if datepart(month,highvalue)<10 then
month_name = '0' || datepart(month,highvalue);
else
month_name = datepart(month,highvalue);
end if;
partition_name = 'p_' || year_name ||'_'|| month_name;
highvalue=dateadd(MM,1,highvalue);
year_name = datepart(year,highvalue);
month_name=datepart(month,highvalue);
dSql := 'alter table '|| sTable_name || ' drop partition p_2999';
sSql := 'alter table '|| sTable_name || ' add partition ' || partition_name || ' values less than(DATETIME''' || year_name || '-' || month_name || '-01 00:00:00'')';
aSql := 'alter table '|| sTable_name || ' add partition p_2999 values less than (MAXVALUE)';
execute immediate dSql;
execute immediate sSql;
execute immediate aSql;
end;
設置job,定時調用調用該存儲過程(過程略)
call addpartition('PART');
查看結果
select partition_name from dba_tab_partitions where table_name='PART' order by 1 desc