Oracle學習(十四)分表分區


一、前言

大數據量的查詢,不僅查詢速度非常慢,而且還會導致數據庫經常宕機,在嘗試添加索引及查詢方式修改后,還有沒有更有效的解決方案呢?

分庫、分表、分區這些概念咱就應該了解一下。

二、分表

假如一個大型商城有一個訂購關系表,每個用戶的訂單都落在這個表里面,那么時間一長,要進行查詢的時候,肯定慢得要死,這樣的系統給客戶用,那就涼涼思密達了...

拆分思想

咱可以對這個總表進行拆分,例如對年進行拆分,每個年表只存一年的記錄,那么這樣數據就分散開來了,每個表的數據就少很多,根據具體情況還可以按月分,按日分等等...

PS:注意,分表使用時,查詢語句里要進行動態拼裝查詢的表名。

三、分區

簡介

年表創建過后,查詢就是查詢年表中的數據,可是雖然分表了,但是年表中的數據量仍然很大,查詢速度雖然有提升,但並不能滿足用戶的要求,此時考慮在年表中再根據月份進行分區。

定義

表分區后,邏輯上仍然是一張表,只不過將表中的數據在物理上存放到多個表空間

目的

這樣在查詢數據時,會查詢相應分區的數據,減少SQL操作的數據量,避免了全表掃描,從而提升查詢效率

水平分區

進行分區,舉個例子來說,就是一個表中有1000萬條數據,每100萬條數據划一個分區,這樣就將表中數據分到10個分區中去。

PS:水平分區要通過某個特定的屬性列進行分區,如用時間先orderBy后再分區。

垂直分區

進行分區,減少表的寬度,從而提升查詢效率。

比如一個學生表中,有他相關的信息列,還有論文列以CLOB存儲,可以把這些不經常使用的CLOB划分到另一個分區,需要訪問時再調用它。

代碼樣例

--水平分區

--按照訂單時間進行水平分區
CREATE TABLE ORDER_ACTIVITIES   
(   
    ORDER_ID      NUMBER(7) NOT NULL,   
    ORDER_DATE    DATE,   
    TOTAL_AMOUNT NUMBER,   
    CUSTOTMER_ID NUMBER(7),   
    PAID   CHAR(1)   
)   
PARTITION BY RANGE (ORDER_DATE)   
(  
  PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACE ORD_TS01,  
  PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,  
  PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03  
);  

--按省份進行分區
CREATE  TABLE  ListTable  
(   
    id    INT  PRIMARY  KEY ,   
    name  VARCHAR (20),   
    area  VARCHAR (10)   
)   
PARTITION  BY  LIST (area)   
(   
    PARTITION  part1 VALUES ('guangdong','beijing') TABLESPACE  Part1_tb,   
    PARTITION  part2 VALUES ('shanghai','nanjing')  TABLESPACE  Part2_tb   
);  


--垂直分區

PS:垂直分區思路是將寫入操作比較頻繁的數據表,把這個兩個表分離出來,放在不同的服務器
PS:可以理解為外鍵的關聯方式(不知道准不准確...)

--查詢分區數據
select * from 表 partition(分區名) where 條件;  

 

參考資料:


免責聲明!

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



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