oracle中的分區表
查看數據庫名
SQL> select name from v$database;
查看實例名
SQL> select instance_name from v$instance;
oracle分區表
1.表空間及分區表的概念
表空間:是一個或多個數據文件的集合,所有的數據對象都存放在指定的表空間中,但主要存放的是表,所以稱作表空間。
分區表:
當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對錶進行分區。
表進行分區後,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。
首先明確分區表和表分區的區別:表分區是一種思想,分區表示一種技術實現。當表的大小過G的時候
可以考慮進行表分區,提高查詢效率,均衡IO。oracle分區表是oracle數據庫提供的一種表分區的實現形式。
表進行分區後,邏輯上仍然是一張表,原來的查詢SQL同樣生效,同時可以採用使用分區查詢來優化SQL查詢效率,不至於每次都掃描整個表
2.表分區的具體作用
Oracle的表分區功能通過改善可管理性、性能和可用性,從而爲各式應用程序帶來了極大的好處。通常,分區可以使某些查詢以及維護操作的性能大大提高。
此外,分區還可以極大簡化常見的管理任務,分區是構建千兆字節數據系統或超高可用性系統的關鍵工具。
分區功能能夠將表、索引或索引組織表進一步細分爲段,這些數據庫對象的段叫做分區。
每個分區有自己的名稱,還可以選擇自己的存儲特性。
從數據庫管理員的角度來看,一個分區後的對象具有多個段,這些段既可進行集體管理,也可單獨管理,
這就使數據庫管理員在管理分區後的對象時有相當大的靈活性。
但是,從應用程序的角度來看,分區後的表與非分區表完全相同,使用 SQL DML 命令訪問分區後的表時,無需任何修改。
什麼時候使用分區表:
1、表的大小超過2GB。
2、表中包含歷史數據,新的數據被增加到新的分區中。
3.表分區的優缺點
表分區有以下優點:
1、改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。
2、增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;
3、維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;
4、均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能。
缺點:
分區表相關:已經存在的表沒有方法可以直接轉化爲分區表。不過 Oracle 提供了在線重定義表的功能。
分區表的基本操作:
1.按時間分區表創建:
create table t_test (
pk_id number(30) not null,
add_date_time DATE,
constraintPK_T_TEST primary key (pk_id)
)
PARTITION BY RANGE (add_date_time)
(
PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
PARTITION t_test_2014VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))TABLESPACE TS_MISPS
)
其中add_date_time爲分區字段,每一年一個分區。
插入100W數據
declare
i int := 1;
yearVARCHAR2(20);
begin
loop
year := CASEmod(i, 3)
WHEN 0 THEN
'2012-01-14 12:00:00'
WHEN 1 THEN
'2013-01-14 12:00:00'
ELSE
'2014-01-14 12:00:00'
END;
insert into t_test values(i, to_date(year, 'yyyy-mm-dd hh24:mi:ss'));
exit when i= 1000000;
i := i + 1;
end loop;
end;
查看分區的詳細信息:
Select table_name,partition_name,high_value fromdba_tab_partitions where table_name='T_TEST';
2、分區表修改
2.1增加一個分區
分兩種情況:1.沒有maxvalue分區。2.有maxvalue分區。我們創建的分區就是沒有maxValue的分區
1.沒有maxvalue分區添加新分區:
alter table t_test add partition t_test_2015 VALUESLESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACETS_MISPS ;
2、有maxvalue分區添加新分區:
有了maxvalue,就不能直接add partition,而是需要max分區split。例如我們將創建的分區的語句修改下:
create table t_test (
pk_id number(30) not null,
add_date_time DATE,
constraintPK_T_TEST primary key (pk_id)
)
PARTITION BY RANGE (add_date_time)
(
PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
PARTITIONt_test_2014 VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
PARTITION t_test_maxVALUES LESS THAN (MAXVALUE)
)
增加一個2016年的分區語句爲:
alter table t_test split partition t_test_max at(TO_DATE('2016-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) into (partitiont_test_2015,partition t_test_max);
2.2刪除一個分區
alter table t_test drop partition t_test_2014
注:droppartition時,該分區內存儲的數據也將同時刪除,你的本意是希望刪除掉指定的分區但保留數據,你應該使用merge partition,執行該語句會導致glocal索引的失效需要重建全局索引
Alter table t_test merge partitions t_test_2013 ,t_Test_2014 into partition t_Test_2013_to_2014
2.3合併分區
相鄰的分區可以merge爲一個分區,新分區的下邊界爲原來邊界值較低的分區,上邊界爲原來邊界值較高的分區,原先的局部索引相應也會合並,全局索引會失效,需要rebuild。
二、對分區表進行查詢
2.1查詢
不使用分區查詢:默認查詢所有分區數據
select * from t_test
使用分區查詢:只查詢該分區數據
select * from t_testpartition(t_test_2014) where add_date_time >=TO_DATE('2014-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss');
.1插入
insert into t_test values(i, to_date(year,'yyyy-mm-dd hh24:mi:ss'));
使用分區刪除
更新的時候指定了分區,而根據查詢的記錄不在該分區中時,將不會刪除數據
delete t_test partition(t_test_2013) where id=1;
不使用分區刪除
delete t_test whereid=1;
2.1修改
使用分區更新
更新的時候指定了分區,而根據查詢的記錄不在該分區中時,將不會更新數據
delete t_test where id=1;
update t_test partition(t_test) set id=1 where id=2;
不使用分區
delete t_test where id=1;
update t_test set id=1 where id=2;
創建表空間
create tablespace part1
datafile 'E:/oracle_tablespaces/prat1.dbf'
size 1500M
autoextend on next 5M maxsize 3000M;
刪除表空間
drop tablespace part1 including contents and datafiles
創建分區表:
create table obj_range
(object_id number,
object_name varchar2(128),
created date,
object_type varchar2(19)
)
partition by range(object_id)
(
partition range_p1 values less than(3000) tablespace part1,
partition range_p2 values less than(6000) tablespace part2,
partition range_p3 values less than(maxvalue) tablespace part3
);
寫一個pl/sql 腳本插入數據:
declare
i int := 1;
year VARCHAR2(20);
begin
loop
year := CASE mod(i, 3)
WHEN 0 THEN
'2012-01-14 12:00:00'
WHEN 1 THEN
'2013-01-14 12:00:00'
ELSE
'2014-01-14 12:00:00'
END;
insert into obj_range values(i,to_char(i), to_date(year, 'yyyy-mm-dd hh24:mi:ss'));
exit when i= 1000000;
i := i + 1;
end loop;
end;
查看分區的信息:
select table_name,partition_name,high_value from dba_tab_partitions where table_name='prat1';
hash分區表:
create table obj_hash
(object_id number,
object_name varchar2(128),
created date,
)
partition by hash(object_name)
(
partition hash_p1 tablespace part1,
partition hash_p2 tablespace part2,
partition hash_p3 tablespace part3
)
SQL> select name from v$database;
查看實例名
SQL> select instance_name from v$instance;
oracle分區表
1.表空間及分區表的概念
表空間:是一個或多個數據文件的集合,所有的數據對象都存放在指定的表空間中,但主要存放的是表,所以稱作表空間。
分區表:
當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對錶進行分區。
表進行分區後,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。
首先明確分區表和表分區的區別:表分區是一種思想,分區表示一種技術實現。當表的大小過G的時候
可以考慮進行表分區,提高查詢效率,均衡IO。oracle分區表是oracle數據庫提供的一種表分區的實現形式。
表進行分區後,邏輯上仍然是一張表,原來的查詢SQL同樣生效,同時可以採用使用分區查詢來優化SQL查詢效率,不至於每次都掃描整個表
2.表分區的具體作用
Oracle的表分區功能通過改善可管理性、性能和可用性,從而爲各式應用程序帶來了極大的好處。通常,分區可以使某些查詢以及維護操作的性能大大提高。
此外,分區還可以極大簡化常見的管理任務,分區是構建千兆字節數據系統或超高可用性系統的關鍵工具。
分區功能能夠將表、索引或索引組織表進一步細分爲段,這些數據庫對象的段叫做分區。
每個分區有自己的名稱,還可以選擇自己的存儲特性。
從數據庫管理員的角度來看,一個分區後的對象具有多個段,這些段既可進行集體管理,也可單獨管理,
這就使數據庫管理員在管理分區後的對象時有相當大的靈活性。
但是,從應用程序的角度來看,分區後的表與非分區表完全相同,使用 SQL DML 命令訪問分區後的表時,無需任何修改。
什麼時候使用分區表:
1、表的大小超過2GB。
2、表中包含歷史數據,新的數據被增加到新的分區中。
3.表分區的優缺點
表分區有以下優點:
1、改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。
2、增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;
3、維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;
4、均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能。
缺點:
分區表相關:已經存在的表沒有方法可以直接轉化爲分區表。不過 Oracle 提供了在線重定義表的功能。
分區表的基本操作:
1.按時間分區表創建:
create table t_test (
pk_id number(30) not null,
add_date_time DATE,
constraintPK_T_TEST primary key (pk_id)
)
PARTITION BY RANGE (add_date_time)
(
PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
PARTITION t_test_2014VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))TABLESPACE TS_MISPS
)
其中add_date_time爲分區字段,每一年一個分區。
插入100W數據
declare
i int := 1;
yearVARCHAR2(20);
begin
loop
year := CASEmod(i, 3)
WHEN 0 THEN
'2012-01-14 12:00:00'
WHEN 1 THEN
'2013-01-14 12:00:00'
ELSE
'2014-01-14 12:00:00'
END;
insert into t_test values(i, to_date(year, 'yyyy-mm-dd hh24:mi:ss'));
exit when i= 1000000;
i := i + 1;
end loop;
end;
查看分區的詳細信息:
Select table_name,partition_name,high_value fromdba_tab_partitions where table_name='T_TEST';
2、分區表修改
2.1增加一個分區
分兩種情況:1.沒有maxvalue分區。2.有maxvalue分區。我們創建的分區就是沒有maxValue的分區
1.沒有maxvalue分區添加新分區:
alter table t_test add partition t_test_2015 VALUESLESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACETS_MISPS ;
2、有maxvalue分區添加新分區:
有了maxvalue,就不能直接add partition,而是需要max分區split。例如我們將創建的分區的語句修改下:
create table t_test (
pk_id number(30) not null,
add_date_time DATE,
constraintPK_T_TEST primary key (pk_id)
)
PARTITION BY RANGE (add_date_time)
(
PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
PARTITIONt_test_2014 VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
PARTITION t_test_maxVALUES LESS THAN (MAXVALUE)
)
增加一個2016年的分區語句爲:
alter table t_test split partition t_test_max at(TO_DATE('2016-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) into (partitiont_test_2015,partition t_test_max);
2.2刪除一個分區
alter table t_test drop partition t_test_2014
注:droppartition時,該分區內存儲的數據也將同時刪除,你的本意是希望刪除掉指定的分區但保留數據,你應該使用merge partition,執行該語句會導致glocal索引的失效需要重建全局索引
Alter table t_test merge partitions t_test_2013 ,t_Test_2014 into partition t_Test_2013_to_2014
2.3合併分區
相鄰的分區可以merge爲一個分區,新分區的下邊界爲原來邊界值較低的分區,上邊界爲原來邊界值較高的分區,原先的局部索引相應也會合並,全局索引會失效,需要rebuild。
二、對分區表進行查詢
2.1查詢
不使用分區查詢:默認查詢所有分區數據
select * from t_test
使用分區查詢:只查詢該分區數據
select * from t_testpartition(t_test_2014) where add_date_time >=TO_DATE('2014-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss');
.1插入
insert into t_test values(i, to_date(year,'yyyy-mm-dd hh24:mi:ss'));
使用分區刪除
更新的時候指定了分區,而根據查詢的記錄不在該分區中時,將不會刪除數據
delete t_test partition(t_test_2013) where id=1;
不使用分區刪除
delete t_test whereid=1;
2.1修改
使用分區更新
更新的時候指定了分區,而根據查詢的記錄不在該分區中時,將不會更新數據
delete t_test where id=1;
update t_test partition(t_test) set id=1 where id=2;
不使用分區
delete t_test where id=1;
update t_test set id=1 where id=2;
創建表空間
create tablespace part1
datafile 'E:/oracle_tablespaces/prat1.dbf'
size 1500M
autoextend on next 5M maxsize 3000M;
刪除表空間
drop tablespace part1 including contents and datafiles
創建分區表:
create table obj_range
(object_id number,
object_name varchar2(128),
created date,
object_type varchar2(19)
)
partition by range(object_id)
(
partition range_p1 values less than(3000) tablespace part1,
partition range_p2 values less than(6000) tablespace part2,
partition range_p3 values less than(maxvalue) tablespace part3
);
寫一個pl/sql 腳本插入數據:
declare
i int := 1;
year VARCHAR2(20);
begin
loop
year := CASE mod(i, 3)
WHEN 0 THEN
'2012-01-14 12:00:00'
WHEN 1 THEN
'2013-01-14 12:00:00'
ELSE
'2014-01-14 12:00:00'
END;
insert into obj_range values(i,to_char(i), to_date(year, 'yyyy-mm-dd hh24:mi:ss'));
exit when i= 1000000;
i := i + 1;
end loop;
end;
查看分區的信息:
select table_name,partition_name,high_value from dba_tab_partitions where table_name='prat1';
hash分區表:
create table obj_hash
(object_id number,
object_name varchar2(128),
created date,
)
partition by hash(object_name)
(
partition hash_p1 tablespace part1,
partition hash_p2 tablespace part2,
partition hash_p3 tablespace part3
)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.