達夢數據庫分區


達夢數據庫分區

分區是指將表、索引等數據庫對象划分為較小的可管理片段的技術,一個表被分區后,對表的查詢操作可以局限於某個分區進行,而不是整個表,這樣可以大大提高查詢速度,在分區表中,子表跟主表具有相同的邏輯結構,主表本身不存儲數據,所有數據只存儲在子表中,從而實現不同分區的完全獨立性,可滿足企業高可用性、 均衡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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM