Oracle?range時間范圍自動分區的創建方式
目錄
- Oracle range時間范圍自動分區
- 1.創建測試表,分區字段CDAT NUMBER()
- 2.執行增加分區語句
- 3.創建新的分區測試空表
- ----------使用企業版ORACLE進行測試分區以及分區自增長---------
- 1.使用固定的分區,每月新增數據需要手工增加對應分區
- 1.1創建相應固定分區表
- 1.2 將原有表中2022年底數據插入(原表有202201-202205的月底數據)
- 1.3 新增一份分區
- 1.4 插入大于20220501的數據實際就是原表中CDAT是20220531的數據
- 1.5 刪除新增的分區,再次新建分區日期是20230501
- 1.6 再次插入大于20220501的數據實際就是原表中CDAT是20220531的數據
- 2.自增長分區
- 2.1創建一張表,分區字段為CDAT,字段類型為NUMBER;
- 2.2使用insert語句將原未分區表數據插入分區測試表。
Oracle range時間范圍自動分區
Oracle11G之前的版本,分區大概分為4種:范圍分區:range 、列表分區:list、哈希分區:hash、復合分區:range+list or hash);
分區的優點:1.改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。
2.增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;
3.維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;可單獨備份某分區;
4.均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能。
分區的缺點:1.已經存在的表不能直接轉化為分區表。不過 Oracle 提供了在線重定義表的功能。
分區的特殊性:1.含有 LONG、LONGRAW 數據類型的表不能進行分區,一般分區類型為varchar,varchar2,number,date
使用分區的場景:
2.每個表的分區或子分區數的總數不能超過 1023 個。1.單表過大,當表大小超過2G,或對于OLTP(On-Line Transaction Processing聯機事務處理過程(OLTP),也稱為面向交易的處理過程,其基本特征是前臺接收的用戶數據可以立即傳送到計算中心進行處理,并在很短的時間內給出處理結果,是對用戶操作快速響應的方式之一)系統,表的記錄超過1000萬。
2.歷史數據需要分離出來,新的數據被加到新的分區中。
3.表數據被使用時特征明顯,例如當年,整月之類。
4.基于這類表大部分的查詢都是只查詢其中一部分數據。
5.按時間段刪除成批的表數據。
6.經常執行并行查詢的表
7.對其中一部分分區表數據可用性要求高
1.創建測試表,分區字段CDAT NUMBER()
---建表create table FQ_TEST (contract_no varchar2(20),loan_st varchar2(8),amt decimal(20,6));--創建自增序列contract_nocreate sequence SEQ_FQTEST_con minvalue 1 maxvalue 999999 increment by 1 start with 1;--創建觸發器create or replace trigger TRIG_FQTEST_conbefore insert on FQ_TEST /*觸發條件:當表FQ_TEST執行插入操作時觸發此觸發器*/ for each row /*對每一行都檢測是否觸發*/begin/*觸發后執行的動作,在此是取得序列SEQ_FQTEST_con的下一個值插入到表BC_ES_IK_HOT_WORD中的id字段中*/select SEQ_FQTEST_con.nextval into :new.CONTRACT_NO from dual;end;
2.執行增加分區語句
ALTER TABLE FQ_TEST ADD PARTITION P1 VALUES LESS THAN (20220131);
提示報錯:
經過分析:提示ORA-14501: object is not partitioned對象未分區。
3.創建新的分區測試空表
--DROP TABLE FQ_TEST_partition;create table FQ_TEST_partition(contract_no varchar2(20),loan_st varchar2(8),amt decimal(20,6))partition by range (loan_st)( partition P1 values less than (20220131));
報錯:
分析:Oracle未啟用Partitioning功能,查詢當前版本是否支持
SELECT VALUE FROM V$OPTION WHERE UPPER(PARAMETER)= 'PARTITIONING';
值為FALSE則不支持。注意標準版是不支持分區操作的,企業版才支持。
----------使用企業版ORACLE進行測試分區以及分區自增長---------
1.使用固定的分區,每月新增數據需要手工增加對應分區
1.1創建相應固定分區表
----創建分區表drop table rp_report_test_xy;-- Create tablecreate table rp_report_test_xy( contract_code VARCHAR2(300), cdat NUMBER(8))partition by range(cdat)-- interval (NUMTOYMINTERVAL(1,"MONTH"))(partition p1 values less than("20150101"),partition p2 values less than("20220201"),partition p3 values less than("20220501"));
1.2 將原有表中2022年底數據插入(原表有202201-202205的月底數據)
報錯原因:由于原表有20220531的數據不在已有的分區內插入數據報錯,將數據限制在20220501之前重新插入。
---查詢現有分區select * from user_tab_partitions where table_name="RP_REPORT_TEST_XY"
---查詢插入的數據具體分區select distinct cdat from rp_report_test_xy partition(P2);---20220131select distinct cdat from rp_report_test_xy partition(P3)---20220430,20220228,20220331
1.3 新增一份分區
ALTER TABLE rp_report_test_xy ADD PARTITION P4 VALUES LESS THAN("20220531");
1.4 插入大于20220501的數據實際就是原表中CDAT是20220531的數據
1.5 刪除新增的分區,再次新建分區日期是20230501
--刪除分區ALTER TABLE rp_report_test_xy DROP PARTITION P4;---重新插入分區ALTER TABLE rp_report_test_xy ADD PARTITION P4 VALUES LESS THAN("20230501");
1.6 再次插入大于20220501的數據實際就是原表中CDAT是20220531的數據
--查詢當前新分區數據select distinct cdat from rp_report_test_xy partition(P4)---20220531
2.自增長分區
2.1創建一張表,分區字段為CDAT,字段類型為NUMBER;
原有未分區的表數據基數為3000多萬
執行報錯:
將創建表語句中CDAT由NUMBER改為DATE則創建成功。
2.2使用insert語句將原未分區表數據插入分區測試表。
---查詢現有分區select * from user_tab_partitions where table_name="RP_REPORT_TEST_XY"
插入數據:注意原NUMBER在插入時要TO_DATE轉換。原表取CDAT是2022年的所有數據插入。
--查看當前分區的數據select * from rp_report_test_xy partition(SYS_P76);
發現20220131的數據劃分到了20220201的區間,20220228劃分到了20220301的區間。
--查看當前分區的數據select * from rp_report_test_xy partition(SYS_P76);
結果 :cdat是20221130的數據。
--刪除某分區ALTER TABLE rp_report_test_xy DROP PARTITION SYS_P76;
到此這篇關于ORACLE分區(range時間范圍自動分區)的文章就介紹到這了,更多相關oracle分區內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!
相關文章:
