oracle表分區詳解

oracle表分區詳解

從以下幾個方面來整理關于分區表的概念及操作:

  1. 表空間及分區表的概念
  2. 表分區的具體作用
  3. 表分區的優缺點
  4. 表分區的幾種類型及操作方法
  5. 對表分區的維護性操作

?1.表空間及分區表的概念

表空間:

  是一個或多個數據文件的集合,所有的數據對象都存放在指定的表空間中,但主要存放的是表, 所以稱作表空間。

?

分區表:

當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區。表進行分區后,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至于每次都掃描整張表。

?

2.表分區的具體作用

Oracle的表分區功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處。通常,分區可以使某些查詢以及維護操作的性能大大提高。此外,分區還可以極大簡化常見的管理任務,分區是構建千兆字節數據系統或超高可用性系統的關鍵工具。

?

分區功能能夠將表、索引或索引組織表進一步細分為段,這些數據庫對象的段叫做分區。每個分區有自己的名稱,還可以選擇自己的存儲特性。從數據庫 管理員的角度來看,一個分區后的對象具有多個段,這些段既可進行集體管理,也可單獨管理,這就使數據庫管理員在管理分區后的對象時有相當大的靈活性。但 是,從應用程序的角度來看,分區后的表與非分區表完全相同,使用 SQL DML 命令訪問分區后的表時,無需任何修改。

?

什么時候使用分區表:

1)?? 表的大小超過2GB。

2)?? 表中包含歷史數據,新的數據被增加都新的分區中。

?

3.表分區的優缺點

優點:

1)?? 改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。

2)?? 增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;

3)?? 維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;

4)?? 均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能。

?

缺點:

分區表相關,已經存在的表沒有方法可以直接轉化為分區表。不過 Oracle 提供了在線重定義表的功能。

?

4.表分區的幾種類型及操作方法

1.范圍分區

范圍分區將數據基于范圍映射到每一個分區,這個范圍是你在創建分區時指定的分區鍵決定的。這種分區方式是最為常用的,并且分區鍵經常采用日期。舉個例子:你可能會將銷售數據按照月份進行分區。

當使用范圍分區時,請考慮以下幾個規則:

1)?? 每一個分區都必須有一個VALUES LESS THEN子句,它指定了一個不包括在該分區中的上限值。分區鍵的任何值等于或者大于這個上限值的記錄都會被加入到下一個高一些的分區中。

2)?? 所有分區,除了第一個,都會有一個隱式的下限值,這個值就是此分區的前一個分區的上限值。

3)?? 在最高的分區中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高于其它分區中的任何分區鍵的值,也可以理解為高于任何分區中指定的VALUE LESS THEN的值,同時包括空值。

例1:

假設有一個CUSTOMER表,表中有數據200000行,我們將此表通過CUSTOMER_ID進行分區,每個分區存儲100000行,我們將每個分區保存到單獨的表空間中,這樣數據文件就可以跨越多個物理磁盤。下面是創建表和分區的代碼,如下:

復制代碼
CREATE TABLE CUSTOMER
(CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,FIRST_NAME  VARCHAR2(30) NOT NULL,LAST_NAME   VARCHAR2(30) NOT NULL,PHONE        VARCHAR2(15) NOT NULL,EMAIL        VARCHAR2(80),STATUS       CHAR(1)
)
PARTITION BY RANGE (CUSTOMER_ID)
(PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02
)
復制代碼

?

例2:按時間劃分

復制代碼
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')) TABLESPACEORD_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)
復制代碼

?

例3:MAXVALUE

復制代碼
CREATE TABLE RangeTable
(idd   INT PRIMARY KEY ,iNAME VARCHAR(10),grade INT 
)
PARTITION  BY  RANGE (grade)
(PARTITION  part1 VALUES  LESS  THEN (1000) TABLESPACE  Part1_tb,PARTITION  part2 VALUES  LESS  THEN (MAXVALUE) TABLESPACE  Part2_tb
);
復制代碼

?

2.列表分區:

該分區的特點是某列的值只有幾個,基于這樣的特點我們可以采用列表分區。

例1

復制代碼
CREATE TABLE PROBLEM_TICKETS
(PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY,DESCRIPTION  VARCHAR2(2000),CUSTOMER_ID  NUMBER(7) NOT NULL,DATE_ENTERED DATE NOT NULL,STATUS       VARCHAR2(20)
)
PARTITION BY LIST (STATUS)
(PARTITION PROB_ACTIVE   VALUES ('ACTIVE') TABLESPACE PROB_TS01,PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02
復制代碼

?

例2

復制代碼
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
);)
復制代碼

?

?

3.散列分區:

這類分區是在列值上使用散列算法,以確定將行放入哪個分區中。當列的值沒有合適的條件時,建議使用散列分區。

散列分區為通過指定分區編號來均勻分布數據的一種分區類型,因為通過在I/O設備上進行散列分區,使得這些分區大小一致。

例1:

復制代碼
CREATE TABLE HASH_TABLE
(COL NUMBER(8),INF VARCHAR2(100)
)
PARTITION BY HASH (COL)
(PARTITION PART01 TABLESPACE HASH_TS01,PARTITION PART02 TABLESPACE HASH_TS02,PARTITION PART03 TABLESPACE HASH_TS03
)
復制代碼

?

簡寫:

復制代碼
CREATE TABLE emp
(empno NUMBER (4),ename VARCHAR2 (30),sal   NUMBER
)
PARTITION BY  HASH (empno) PARTITIONS 8
STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
復制代碼

?

?

hash分區最主要的機制是根據hash算法來計算具體某條紀錄應該插入到哪個分區中,hash算法中最重要的是hash函數,Oracle中如果你要使用hash分區,只需指定分區的數量即可。建議分區的數量采用2的n次方,這樣可以使得各個分區間數據分布更加均勻。

?

4.組合范圍散列分區

這種分區是基于范圍分區和列表分區,表首先按某列進行范圍分區,然后再按某列進行列表分區,分區之中的分區被稱為子分區。

復制代碼
CREATE TABLE SALES
(PRODUCT_ID VARCHAR2(5),SALES_DATE DATE,SALES_COST NUMBER(10),STATUS VARCHAR2(20))PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)(PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009(SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009),PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009(SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009)
)
復制代碼

?

?

5.復合范圍散列分區:

這種分區是基于范圍分區和散列分區,表首先按某列進行范圍分區,然后再按某列進行散列分區。

復制代碼
create table dinya_test(transaction_id number primary key,item_id number(8) not null,item_description varchar2(300),transaction_date date)partition by range(transaction_date)subpartition by hash(transaction_id)  subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)(partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)),partition part_03 values less than(maxvalue));
復制代碼

?

?

5.有關表分區的一些維護性操作

1)?? 添加分區

以下代碼給SALES表添加了一個P3分區

ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD')); 

?

注意:以上添加的分區界限應該高于最后一個分區界限。

以下代碼給SALES表的P3分區添加了一個P3SUB1子分區

ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');

?

2)?? 刪除分區

以下代碼刪除了P3表分區:

ALTER TABLE SALES DROP PARTITION P3;

?

在以下代碼刪除了P4SUB1子分區:

ALTER TABLE SALES DROP SUBPARTITION P4SUB1;

?

注意:如果刪除的分區是表中唯一的分區,那么此分區將不能被刪除,要想刪除此分區,必須刪除表。

3)?? 截斷分區

截斷某個分區是指刪除某個分區中的數據,并不會刪除分區,也不會刪除其它分區中的數據。當表中即使只有一個分區時,也可以截斷該分區。通過以下代碼截斷分區:

ALTER TABLE SALES TRUNCATE PARTITION P2;

?

通過以下代碼截斷子分區:

ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;

?

4)?? 合并分區

合并分區是將相鄰的分區合并成一個分區,結果分區將采用較高分區的界限,值得注意的是,不能將分區合并到界限較低的分區。以下代碼實現了P1 P2分區的合并:

ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;

?

5)?? 拆分分區

拆分分區將一個分區拆分兩個新分區,拆分后原來分區不再存在。注意不能對HASH類型的分區進行拆分。

ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22); 

?

6)?? 接合分區(coalesca)

結合分區是將散列分區中的數據接合到其它分區中,當散列分區中的數據比較大時,可以增加散列分區,然后進行接合,值得注意的是,接合分區只能用于散列分區中。通過以下代碼進行接合分區:

ALTER TABLE SALES COALESCA PARTITION;

?

7)?? 重命名表分區

以下代碼將P21更改為P2

ALTER TABLE SALES RENAME PARTITION P21 TO P2;

?

8)?? 相關查詢

跨分區查詢

復制代碼
select sum( *) from(select count(*) cn from t_table_SS PARTITION (P200709_1)union allselect count(*) cn from t_table_SS PARTITION (P200709_2)); 
復制代碼

?

查詢表上有多少分區

SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName' 

?

查詢索引信息

復制代碼
select object_name,object_type,tablespace_name,sum(value)from v$segment_statisticswhere statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'group by object_name,object_type,tablespace_nameorder by 4 desc 
復制代碼

?

?

--顯示數據庫所有分區表的信息:

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 p5; 

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387916.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線性插值插值_揭秘插值搜索

線性插值插值搜索算法指南 (Searching Algorithm Guide) Prior to this article, I have written about Binary Search. Check it out if you haven’t seen it. In this article, we will be discussing Interpolation Search, which is an improvement of Binary Search when…

其他命令

keys *這個可以全部的值del name 這個可以刪除某個127.0.0.1:6379> del s_set(integer) 1127.0.0.1:6379> keys z*(匹配)1) "z_set2"2) "z_set"127.0.0.1:6379> exists sex(integer) 0 127.0.0.1:6379> get a"3232…

建按月日自增分區表

一、建按月自增分區表: 1.1建表SQL> create table month_interval_partition_table (id number,time_col date) partition by range(time_col)2 interval (numtoyminterval(1,month))3 (4 partition p_month_1 values less than (to_date(2014-01-01,yyyy-mm…

#1123-JSP隱含對象

JSP 隱含對象 JSP隱含對象是JSP容器為每個頁面提供的Java對象,開發者可以直接使用它們而不用顯式聲明。JSP隱含對象也被稱為預定義變量。 JSP所支持的九大隱含對象: 對象,描述 request,HttpServletRequest類的實例 response&#…

按照時間,每天分區;按照數字,200000一個分區

按照時間,每天分區 create table test_p(id number,createtime date) partition by range(createtime) interval(numtodsinterval(1,day)) store in (users) ( partition test_p_p1 values less than(to_date(20140110,yyyymmdd)) ); create index index_test_p_id …

如果您不將Docker用于數據科學項目,那么您將生活在1985年

重點 (Top highlight)One of the hardest problems that new programmers face is understanding the concept of an ‘environment’. An environment is what you could say, the system that you code within. In principal it sounds easy, but later on in your career yo…

jmeter對oracle壓力測試

下載Oracle的jdbc數據庫驅動包,注意Oracle數據庫的版本,這里使用的是:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production; 一般數據庫的驅動包文件在安裝路徑下:D:\oracle\product\10.2.…

集合里面的 E是泛型 暫且認為是object

集合里面的 E是泛型 暫且認為是object轉載于:https://www.cnblogs.com/classmethond/p/10011374.html

docker部署flask_使用Docker,GCP Cloud Run和Flask部署Scikit-Learn NLP模型

docker部署flaskA brief guide to building an app to serve a natural language processing model, containerizing it and deploying it.構建用于服務自然語言處理模型,將其容器化和部署的應用程序的簡要指南。 By: Edward Krueger and Douglas Franklin.作者&am…

異常處理的原則

1:函數內部如果拋出需要檢測的異常,那么函數上必須要聲明,否則必須在函數內用try catch捕捉,否則編譯失敗。2:如果調用到了聲明異常的函數,要么try catch 要么throws,否則編譯失敗。3&#xff…

模塊化整理

#region常量#endregion#region 事件#endregion#region 字段#endregion#region 屬性#endregion#region 方法#endregion#region Unity回調#endregion#region 事件回調#endregion#region 幫助方法#endregion來自為知筆記(Wiz)轉載于:https://www.cnblogs.com/soviby/p/10013294.ht…

在oracle中處理日期大全

在oracle中處理日期大全 TO_DATE格式 Day: dd number 12 dy abbreviated fri day spelled out friday ddspth spelled out, ordinal twelfth Month: mm number 03 mon abbreviated mar month spelled out march Year: yy two digits 98 yyyy four …

BZOJ4868 Shoi2017期末考試(三分+貪心)

容易想到枚舉最晚發布成績的課哪天發布,這樣與ti和C有關的貢獻固定。每門課要么貢獻一些調節次數,要么需要一些調節次數,剩下的算貢獻也非常顯然。這樣就能做到平方級別了。 然后大膽猜想這是一個凸函數三分就能A掉了。具體的,延遲…

SQL的執行計劃

SQL的執行計劃實際代表了目標SQL在Oracle數據庫內部的具體執行步驟,作為調優,只有知道了優化器選擇的執行計劃是否為當前情形下最優的執行計劃,才能夠知道下一步往什么方向。 執行計劃的定義:執行目標SQL的所有步驟的組合。 我們首…

問卷 假設檢驗 t檢驗_真實問題的假設檢驗

問卷 假設檢驗 t檢驗A statistical Hypothesis is a belief made about a population parameter. This belief may or might not be right. In other words, hypothesis testing is a proper technique utilized by scientist to support or reject statistical hypotheses. Th…

webpack打包ES6降級ES5

Babel是一個廣泛使用的轉碼器,babel可以將ES6代碼完美地轉換為ES5代碼,所以我們不用等到瀏覽器的支持就可以在項目中使用ES6的特性。 安裝babel實現ES6到ES5 npm install -D babel-core babel-preset-es2015 復制代碼安裝babel-loader npm install -D ba…

[轉帖]USB-C和Thunderbolt 3連接線你搞懂了嗎?---沒搞明白.

USB-C和Thunderbolt 3連接線你搞懂了嗎? 2018年11月25日 07:30 6318 次閱讀 稿源:威鋒網 3 條評論按照計算行業的風潮,USB Type-C 將會是下一代主流的接口。不過,在過去兩年時間里,關于 USB-C、Thunderbolt 3、USB 3.1…

sqldeveloper的查看執行計劃快捷鍵F10

簡介:本文全面詳細介紹oracle執行計劃的相關的概念,訪問數據的存取方法,表之間的連接等內容。并有總結和概述,便于理解與記憶!目錄---一.相關的概念Rowid的概念Recursive Sql概念Predicate(謂詞)DRiving Table(驅動表)…

大數據技術 學習之旅_為什么聚焦是您數據科學之旅的關鍵

大數據技術 學習之旅David Robinson, a data scientist, has said the following quotes:數據科學家David Robinson曾說過以下話: “When you’ve written the same code 3 times, write a function.”“當您編寫了3次相同的代碼時,請編寫一個函數。” …

SQL 語句

去重字段里的值 SELECT DISTINCT cat_id,goods_sn,repay FROM ecs_goods where cat_id ! 20014 刪除除去 去重字段 DELETE FROM ecs_goods where goods_id NOT IN ( select bid from (select min(goods_id) as bid from ecs_goods group by cat_id,goods_sn,repay) as b );轉…