Oracle數據庫--解決單張表中數據量巨大(大數據、數據量上百萬級別,后查詢,更新數據等耗時劇增)


版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/QQ578473688/article/details/54561397
思路1:采用備份表
備份表中存儲不活躍的數據eg:只有查詢操作的數據(數據的部分屬性字段不再更改)且查詢次數也較少;
備份表可以是一張或者多張備份表,若采用多張備份表,則定期創建備份表(備份表的命名要規范,可以考慮使用原表名稱+時間戳命名)
采用多張備份表:定期創建一個備份表(備份一定期間范圍內的數據,多張備份表采用聯合查詢)
多張備份表時可以使用視圖對多個備份表進行聯合查詢。
是否采用多張備份表是基於總的數據量的大小+Oracle數據庫對單張表存儲數據的支持。
思路2:Oracle數據庫采用 分區表(物理磁盤上存儲在不同的位置,邏輯上仍為一張表)
當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區。表進行分區后,邏輯上表仍然是一張完整的表,
只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。
從應用程序的角度來看,分區后的表與非分區表完全相同,使用 SQL DML 命令訪問分區后的表時,無需任何修改。
使用分區表操作步驟:
1.創建多個表空間:(備注:ADC_BACK_1 、ADC_BACK_2、ADC_BACK_3、USERS 為表空間名稱,datafile后面指定了表空間的物理磁盤存儲路徑)
create tablespace ADC_BACK_1 datafile 'D:\OracleBack\ADC1.dnf' size 500M;
create tablespace ADC_BACK_2 datafile 'D:\OracleBack\ADC2.dnf' size 500M;
create tablespace ADC_BACK_3 datafile 'D:\OracleBack\ADC3.dnf' size 500M;
create tablespace USERS datafile 'D:\OracleBack\ADC4.dnf' size 500M;
2.一次性在不同的表空間創建數據庫表(同時指定表字段、數據存儲到哪一表空間的判斷標准)如下:

(備注:range()指定數據庫表中的某一字段作為數據存儲到不同表空間的判斷標准)

(備注:此處在4個不同的表空間分別創建一張表,4張表的結構相同,以后會根據不同的時間產生的數據存儲在不同的表空間的表中)
 
(備注:在最高的分區中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高於其它分區中的任何分區鍵的值,
也可以理解為高於任何分區中指定的VALUE LESS THEN的值,同時包括空值。)
3.以前的SQL查詢語句不變,一樣查詢數據
(備注:查詢數據時,不再全表掃面,只是根據條件掃描一個或多個表空間中的數據庫表,所以查詢性能會有很好的提升)
 
參考:https://www.2cto.com/database/201604/503199.html

 

事例:

create tablespace ADC_BACK_1 datafile 'F:\Oracle\tablespaces\ADC_BACK_1.dnf' size 100M autoextend on next 100m maxsize 20480m extent management local;
create tablespace ADC_BACK_2 datafile 'F:\Oracle\tablespaces\ADC_BACK_2.dnf' size 100M autoextend on next 100m maxsize 20480m extent management local;
create tablespace ADC_BACK_3 datafile 'F:\Oracle\tablespaces\ADC_BACK_3.dnf' size 100M autoextend on next 100m maxsize 20480m extent management local;
create tablespace ADC_BACK_4 datafile 'F:\Oracle\tablespaces\ADC_BACK_4.dnf' size 100M autoextend on next 100m maxsize 20480m extent management local;
create tablespace ADC_BACK_5 datafile 'F:\Oracle\tablespaces\ADC_BACK_5.dnf' size 100M autoextend on next 100m maxsize 20480m extent management local;

 

create table MON_PROCESS_RECORD_BACK(
INFOID VARCHAR2(36),
DIC_FLOWTYPE_ID VARCHAR2(36),
START_TIME DATE,
END_TIME DATE,
IS_SUCCESS CHAR(1),
ERROR_CODE VARCHAR2(2000),
DEL_FLAG CHAR(1),
ID VARCHAR2(36) PRIMARY KEY,
DEALWAY CHAR(1),
DETAIL VARCHAR2(4000),
DIC_EB_PLATFORM_ID VARCHAR2(36),
STATE VARCHAR2(100),
INSTRUCTION_ID VARCHAR2(36),
INSTRUCTION_NUM VARCHAR2(4),
EBI_INFO_CODE VARCHAR2(50),
IS_DISPLAY VARCHAR2(1)
)
partition by range(EBI_INFO_CODE)(
partition part_01 values less than('201608100000000000000') tablespace ADC_BACK_1,
partition part_02 values less than('201609100000000000000') tablespace ADC_BACK_2,
partition part_03 values less than('201610100000000000000') tablespace ADC_BACK_3,
partition part_04 values less than('201611100000000000000') tablespace ADC_BACK_4,
partition part_05 values less than('201612300000000000000') tablespace ADC_BACK_5,
partition part_06 values less than(maxvalue) tablespace USERS
);

 

轉移數據:

insert into MON_PROCESS_RECORD_BACK(
INFOID,
DIC_FLOWTYPE_ID,
START_TIME,
END_TIME,
IS_SUCCESS,
ERROR_CODE,
DEL_FLAG,
ID,
DEALWAY,
DETAIL,
DIC_EB_PLATFORM_ID,
STATE,
INSTRUCTION_ID,
INSTRUCTION_NUM,
EBI_INFO_CODE,
IS_DISPLAY
)
select 
INFOID,
DIC_FLOWTYPE_ID,
START_TIME,
END_TIME,
IS_SUCCESS,
ERROR_CODE,
DEL_FLAG,
ID,
DEALWAY,
DETAIL,
DIC_EB_PLATFORM_ID,
STATE,
INSTRUCTION_ID,
INSTRUCTION_NUM,
EBI_INFO_CODE,
IS_DISPLAY
from MON_PROCESS_RECORD;


免責聲明!

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



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