Oracle11G分區表
當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區。表進行分區后,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。
作用:
Oracle的表分區功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處。通常,分區可以使某些查詢以及維護操作的性能大大提高。此外,分區還可以極大簡化常見的管理任務,分區是構建千兆字節數據系統或超高可用性系統的關鍵工具。
分區功能能夠將表、索引或索引組織表進一步細分為段,這些數據庫對象的段叫做分區。每個分區有自己的名稱,還可以選擇自己的存儲特性。從數據庫管理員的角度來看,一個分區后的對象具有多個段,這些段既可進行集體管理,也可單獨管理,這就使數據庫管理員在管理分區后的對象時有相當大的靈活性。但是,從應用程序的角度來看,分區后的表與非分區表完全相同,使用 SQL DML 命令訪問分區后的表時,無需任何修改。
什么時候用:
1、表的大小超過2GB。
2、表中包含歷史數據,新的數據被增加都新的分區中。
優點:
1、改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。
2、增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;
3、維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;
4、均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能。
1.創建分區表--按月份自動創建分區的分區表
create table table_partition
(
TERMINALNO varchar(100) not null,
ESCFLOWNO varchar(100) not null,
FLOWLOCATION char(1) not null,
TRANSDATE date not null,
TRANSSTAMP timestamp default current_timestamp
) partition by range (TRANSDATE) interval (numtoyMinterval (1,'MONTH'))
(
partition p9 values less than (to_date('2017-10-01', 'yyyy-mm-dd'))
)
tablespace temp_tablespace;
2:分區表增、刪、改、查
--range間隔分區的情況 ORA-14760: 不允許對間隔分區對象執行 ADD PARTITION
--改為非間隔分區 並再改成按天間隔
ALTER TABLE table_partition SET INTERVAL ();
--add partition 不能小於當前分區的最小分區時間
alter table table_partition add partition montu_1 values less than(to_date('20180907','yyyymmdd'));
--按天間隔分區
ALTER TABLE table_partition SET INTERVAL (numtoyMinterval (1,'YEAR'));
--按月間隔分區
ALTER TABLE table_partition SET INTERVAL (numtoyMinterval (1,'MONTH'));
--按天間隔分區
ALTER TABLE table_partition SET INTERVAL (numtoyMinterval (1,'DAY'));
--按周間隔分區
ALTER TABLE table_partition SET INTERVAL (numtoyMinterval (1,'DAY'));
--range非間隔分區的情況
--add partition 不能小於當前分區的最小分區時間
alter table table_partition add partition montu_2 values less than(to_date('20180907','yyyymmdd'));
--按天間隔分區
ALTER TABLE table_partition SET INTERVAL (numtoyMinterval (1,'YEAR'));
--按月間隔分區
ALTER TABLE table_partition SET INTERVAL (numtoyMinterval (1,'MONTH'));
--按天間隔分區
ALTER TABLE table_partition SET INTERVAL (numtoyMinterval (1,'DAY'));
--按周間隔分區
ALTER TABLE table_partition SET INTERVAL (numtoyMinterval (1,'DAY'));
--刪除表分區 注意改刪除會將改分區下面的數據全部刪除
alter table table_partition drop partition P_MONTH_1;
--顯示數據庫所有分區表的信息:
select * from DBA_PART_TABLES
--顯示當前用戶可訪問的所有分區表信息:
select * from ALL_PART_TABLES
--顯示當前用戶所有分區表的信息:
select * from USER_PART_TABLES
--顯示表分區信息 顯示數據庫所有分區表的詳細分區信息:
select * from DBA_TAB_PARTITIONS
--顯示當前用戶可訪問的所有分區表的詳細分區信息:
select * from ALL_TAB_PARTITIONS
--顯示當前用戶所有分區表的詳細分區信息:
select * from USER_TAB_PARTITIONS
--顯示子分區信息 顯示數據庫所有組合分區表的子分區信息:
select * from DBA_TAB_SUBPARTITIONS
--顯示當前用戶可訪問的所有組合分區表的子分區信息:
select * from ALL_TAB_SUBPARTITIONS
--顯示當前用戶所有組合分區表的子分區信息:
select * from USER_TAB_SUBPARTITIONS
--顯示分區列 顯示數據庫所有分區表的分區列信息:
select * from DBA_PART_KEY_COLUMNS
--顯示當前用戶可訪問的所有分區表的分區列信息:
select * from ALL_PART_KEY_COLUMNS
--顯示當前用戶所有分區表的分區列信息:
select * from USER_PART_KEY_COLUMNS
--顯示子分區列 顯示數據庫所有分區表的子分區列信息:
select * from DBA_SUBPART_KEY_COLUMNS
--顯示當前用戶可訪問的所有分區表的子分區列信息:
select * from ALL_SUBPART_KEY_COLUMNS
--顯示當前用戶所有分區表的子分區列信息:
select * from USER_SUBPART_KEY_COLUMNS
--怎樣查詢出oracle數據庫中所有的的分區表
select * from user_tables a where a.partitioned='YES'
--刪除一個表的數據是
truncate table table_name;
--刪除分區表一個分區的數據是
alter table table_name truncate partition montu_2;
--重命名表分區 將a1更改為a2
ALTER TABLE SALES RENAME PARTITION a1 TO a2;
3:按分區查詢數據
--查詢當前分區中數據
select * from esc_trans_log partition(SYS_P97)
-- 跨分區查詢
select * from esc_trans_log partition(SYS_P97)
union all
select * from esc_trans_log partition(SYS_P98)
