1. 程式人生 > >Oracle資料庫--解決單張表中資料量巨大(大資料、資料量上百萬級別,後查詢,更新資料等耗時劇增)

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

思路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;