資料庫分區oracle
A. oracle資料庫是怎樣實現按月分區的
查詢的時候按table來查,一個表的所有分區都屬於table。
但每個分區都是單獨的segment,如果查詢限制了分區鍵,那麼查詢只落在特定的segment,而segment在底層對應的數據塊是不同的,這樣可以減少數據的訪問。
B. 分區是什麼意思Oracle
一、分區的概念
表空間:
是一個或多個數據文件的集合,所有的數據對象都存放在指定的表空間中,但主要存放的是表, 所以稱作表空間。
分區表:
當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區。表進行分區後,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個「表空間」(物理文件上),這樣查詢數據時,不至於每次都掃描整張表而只是從當前的分區查到所要的數據大大提高了數據查詢的速度。
二、分區類型
本文使用的表為oracle用戶hr下的job_history,創建分區使用的表名均為hr_job_history。job_history表數據為:
C. oracle資料庫怎麼建分區
一般語法:
sql">createtablet_test(
pk_idnumber(30)notnull,
add_date_timeDATE,
constraintPK_T_TESTprimarykey(pk_id)
)
PARTITIONBYRANGE(add_date_time)
(
PARTITIONt_test_2013_lessVALUESLESSTHAN(TO_DATE('2013-01-0100:00:00','yyyy-mm-ddhh24:mi:ss'))TABLESPACETS_MISPS,
PARTITIONt_test_2013VALUESLESSTHAN(TO_DATE('2014-01-0100:00:00','yyyy-mm-ddhh24:mi:ss'))TABLESPACETS_MISPS,
PARTITIONt_test_2014VALUESLESSTHAN(TO_DATE('2015-01-0100:00:00','yyyy-mm-ddhh24:mi:ss'))TABLESPACETS_MISPS
);
D. oracle資料庫分區表備份
Oracle提供了分區技術以支持VLDB(Very Large DataBase)。分區表通過對分區列的判斷,把分區列不同的記錄,放到不同的分區中。分區完全對應用透明。
Oracle的分區表可以包括多個分區,每個分區都是一個獨立的段(SEGMENT),可以存放到不同的表空間中。查詢時可以通過查詢表來訪問各個分區中的數據,也可以通過在查詢時直接指定分區的方法來進行查詢。
分區提供以下優點:
由於將數據分散到各個分區中,減少了數據損壞的可能性;
可以對單獨的分區進行備份和恢復;
可以將分區映射到不同的物理磁碟上,來分散IO;
提高可管理性、可用性和性能。
Oracle提供了以下幾種分區類型:
范圍分區(range);
哈希分區(hash);
列表分區(list);
范圍-哈希復合分區(range-hash);
范圍-列表復合分區(range-list)。
Oracle的普通表沒有辦法通過修改屬性的方式直接轉化為分區表,必須通過重建的方式進行轉變,下面介紹三種效率比較高的方法,並說明它們各自的特點。
方法一:利用原表重建分區表。
步驟:
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
表已創建。
SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;
已創建6264行。
SQL> COMMIT;
提交完成。
SQL> CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE))
6 AS SELECT ID, TIME FROM T;
表已創建。
SQL> RENAME T TO T_OLD;
表已重命名。
SQL> RENAME T_NEW TO T;
表已重命名。
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
6264
SQL> SELECT COUNT(*) FROM T PARTITION (P1);
COUNT(*)
----------
0
SQL> SELECT COUNT(*) FROM T PARTITION (P2);
COUNT(*)
----------
6246
SQL> SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
----------
18
優點:方法簡單易用,由於採用DDL語句,不會產生UNDO,且只產生少量REDO,效率相對較高,而且建表完成後數據已經在分布到各個分區中了。
不足:對於數據的一致性方面還需要額外的考慮。由於幾乎沒有辦法通過手工鎖定T表的方式保證一致性,在執行CREATE TABLE語句和RENAME T_NEW TO T語句直接的修改可能會丟失,如果要保證一致性,需要在執行完語句後對數據進行檢查,而這個代價是比較大的。另外在執行兩個RENAME語句之間執行的對T的訪問會失敗。
適用於修改不頻繁的表,在閑時進行操作,表的數據量不宜太大。
方法二:使用交換分區的方法。
步驟:
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
表已創建。
SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;
已創建6264行。
SQL> COMMIT;
提交完成。
SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (MAXVALUE));
表已創建。
SQL> ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;
表已更改。
SQL> RENAME T TO T_OLD;
表已重命名。
SQL> RENAME T_NEW TO T;
表已重命名。
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
6264
優點:只是對數據字典中分區和表的定義進行了修改,沒有數據的修改或復制,效率最高。如果對數據在分區中的分布沒有進一步要求的話,實現比較簡單。在執行完RENAME操作後,可以檢查T_OLD中是否存在數據,如果存在的話,直接將這些數據插入到T中,可以保證對T插入的操作不會丟失。
不足:仍然存在一致性問題,交換分區之後RENAME T_NEW TO T之前,查詢、更新和刪除會出現錯誤或訪問不到數據。如果要求數據分布到多個分區中,則需要進行分區的SPLIT操作,會增加操作的復雜度,效率也會降低。
適用於包含大數據量的表轉到分區表中的一個分區的操作。應盡量在閑時進行操作。
方法三:Oracle9i以上版本,利用在線重定義功能
步驟:
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
表已創建。
SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;
已創建6264行。
SQL> COMMIT;
提交完成。
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T', DBMS_REDEFINITION.CONS_USE_PK);
PL/SQL 過程已成功完成。
SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE));
表已創建。
SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW', -
> 'ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);
PL/SQL 過程已成功完成。
SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('YANGTK', 'T', 'T_NEW');
PL/SQL 過程已成功完成。
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
6264
SQL> SELECT COUNT(*) FROM T PARTITION (P2);
COUNT(*)
----------
6246
SQL> SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
----------
18
優點:保證數據的一致性,在大部分時間內,表T都可以正常進行DML操作。只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強的靈活性,對各種不同的需要都能滿足。而且,可以在切換前進行相應的授權並建立各種約束,可以做到切換完成後不再需要任何額外的管理操作。
不足:實現上比上面兩種略顯復雜。
適用於各種情況。
這里只給出了在線重定義表的一個最簡單的例子,詳細的描述和例子可以參考下面兩篇文章。
Oracle的在線重定義表功能:
Oracle的在線重定義表功能(二):
索引也可以進行分區,分區索引有兩種類型:global和local。對於local索引,每一個表分區對應一個索引分區,當表的分區發生變化時,索引的維護由Oracle自動進行。對於global索引,可以選擇是否分區,而且索引的分區可以不與表分區相對應。當對分區進行維護操作時,通常會導致全局索引的INVALDED,必須在執行完操作後REBUILD。Oracle9i提供了UPDATE GLOBAL INDEXES語句,可以使在進行分區維護的同時重建全局索引。
全局索引可以包含多個分區的值 局部索引比全局索引容易管理,而全局索引比較快
注意:不能為散列分區 或者 子分區創建全局索引
Oracle的分區功能十分強大。不過用起來發現有兩點不大方便:
第一是已經存在的表沒有方法可以直接轉化為分區表。不過Oracle提供了在線重定義表的功能,可以通過這種方式來完成普通表到分區表的轉化。可以參考這個例子:
第二點是如果採用了local分區索引,那麼在增加表分區的時候,索引分區的表空間是不可控制的。如果希望將表和索引的分區分開到不同的表空間且不同索引分區也分散到不同的表空間中,那麼只能在增加分區後,對新增的分區索引單獨rebuild。
Oracle最大允許存在多少個分區呢?
我們可以從Oracle的Concepts手冊上找到這個信息,對於Oracle9iR2:
Tables can be partitioned into up to 64,000 separate partitions.
對於Oracle10gR2,Oracle增強了分區特性:
Tables can be partitioned into up to 1024K-1 separate partitions.
關於何時應該進行分區,Oracle有如下建議:
■ Tables greater than 2GB should always be considered for partitioning.
■ Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.
這些信息是在網上查到的,測試了下確實可以用。
E. oracle資料庫中往分區表裡插入數據時,索引需要先刪掉嗎
需要看是否是全局索引。
如果是全局索引,是需要重建,如果是本地分區索引,還可以繼續使用。
Oracle Database,又名Oracle RDBMS,或簡稱Oracle。是甲骨文公司的一款關系資料庫管理系統。
F. oracle表分區和索引分區
一 分區表技術概述
二 分區索引技術概述
⑴ 本地前綴分區索引
適用場景:
如果歷史數據整理非常頻繁、而且不能承受全局分區索引重建的長時間帶來的索引不可用
同時、日常交易性能尚能接受、則建議設計為本地非前綴分區索引
注意:本地分區索引不能保證唯一性(除非分區鍵是約束的一部分)
缺點:
主要體現在數據的高可用性方面
當DROP分區後、全局分區索引則全部INVALID、除非REBULID
但數據量越大、重建索引的時間越長
一般來講,如果需要將數據按照某個值邏輯聚集,多採用范圍分區。如基於時間數據的按「年」、「月」等分區就是很典型的例子。在許多情況下,范圍分區都能利用到分區消除特性( = >= <= between…and 等篩選條件下)。
如果在表裡無法找到一個合適的屬性來按這個屬性完成范圍分區,但你又想享受分區帶來的性能與可用性的提升,則可以考慮使用散列分區。(適合使用 = IN 等篩選條件)
如果數據中有一列或有一組離散值,且按這一列進行分區很有意義,則這樣的數據就很適合採用列表分區。
如果某些數據邏輯上可以進行范圍分區,但是得到的范圍分區還是太大,不能有效管理,則可以考慮使用組合分區(范圍分區+hash 或范圍分區+列表分區)。
create table procts_table
(
id number(2),
name varchar2(50),
sale_date date
)
partition by range(sale_date)
interval (numtoyminterval(1,'month'))
(
partition p_month_1 values less than (to_date(-01-01','yyyy-mm-dd'))
)
如圖,取 procts_table 中的 sale_date 列作為分區鍵創建按月自增分區;
所有銷售時間在 『2016-01-01』之前的記錄都會被放入 p_month_1 分區;
銷售時間在『2016-01-01』之後的記錄在插入時Oracle會自動創建記錄所屬月的分區;
比如當有銷售時間分別為 2016年1月20日 與 2016年2月20日 的兩條記錄插入時,Oracle會分別創建一個上限值為 『2016-01-31』的分區和一個上限值為『2016-02-29』的分區來存儲這兩條記錄
https://www.cnblogs.com/Dreamer-1/p/6132776.html
G. oracle資料庫如何查看錶的表分區的信息(每個表分區的名字和所屬表空間)
這樣SELECT TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME
FROM USER_TAB_PARTITIONS
註:
USER_TAB_PARTITIONS:可查看分區表的名字、歸屬表空間以及表的詳細分區情況。
USER_PART_TABLES:可查看用戶所有的分區表,以及分區方式。
(7)資料庫分區oracle擴展閱讀:
分區表的作用
Oracle的表分區功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處。通常,分區可以使某些查詢以及維護操作的性能大大提高。此外分區還可以極大簡化常見的管理任務,分區是構建千兆位元組數據系統或超高可用性系統的關鍵工具。
分區功能能夠將表、索引或索引組織表進一步細分為段,這些資料庫對象的段叫做分區。每個分區有自己的名稱,還可以選擇自己的存儲特性。從資料庫管理員的角度來看,一個分區後的對象具有多個段,這些段既可進行集體管理,也可單獨管理,這就使資料庫管理員在管理分區後的對象時有相當大的靈活性。
但是,從應用程序的角度來看,分區後的表與非分區表完全相同,使用 SQL DML 命令訪問分區後的表時,無需任何修改。
H. oracle分區表有什麼作用
Oracle的表分區功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處,分區功能能夠將表、索引或索引組織表進一步細分為段,這些資料庫對象的段叫做分區。
I. 關於Oracle 分區實現和操作的幾個問題
1. 組合分區表的創建方式("范圍-哈稀"),見附1
2. 樓主的需求,即"范圍-范圍分區",在ORACLE 9i, 10g經過測試都是不能實現的
在附1的基礎上修改為"范圍-范圍"組合分區,創建時報錯:ORA-14151:無效的表分區方法
3. 關於sxdtgsh兄的回答,我測了
3.1 沒有maxvalue上限分區設置,在插入超出分區的數據時會報錯ORA-14400: 插入的分區關鍵字未映射到任何分區
3.2 按回答的語句創建分區表沒有問題,但數據無法按照樓主的需求分布
====附1
附錄:創建"范圍-哈稀"組合分區表
CREATE TABLE TAB11 (ID NUMBER,DT DATE)
PARTITION BY RANGE (DT)
SUBPARTITION BY HASH (ID) SUBPARTITIONS 2 -- 自分區個數,可以不寫,由系統判斷
(
PARTITION Y2012 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD'))
(
SUBPARTITION Y2012_H1
,SUBPARTITION Y2012_H2
)
,PARTITION Y2013 VALUES LESS THAN (TO_DATE('2014-01-01','YYYY-MM-DD'))
(
SUBPARTITION Y2013_H1
,SUBPARTITION Y2013_H2
)
,PARTITION YMAX VALUES LESS THAN (MAXVALUE)
(
SUBPARTITION YMAX_H1
,SUBPARTITION YMAX_H2
)
)
====附2,請樓主檢查最後查詢的數據分布
create table T_TEST
(
ID NUMBER(20) NOT NULL,
TIME DATE NOT NULL
)
partition by range(TIME, ID) -- 按時間、ID范圍分區 這個例子是按年的
(
partition P_2012_10 values less than (to_date('2013-01-01','yyyy-MM-dd'), 10),
partition P_2012_20 values less than (to_date('2013-01-01','yyyy-MM-dd'), 20),
partition P_2012_MAX values less than (to_date('2013-01-01','yyyy-MM-dd'), MAXVALUE),
partition P_2013_10 values less than (to_date('2014-01-01','yyyy-MM-dd'), 10),
partition P_2013_20 values less than (to_date('2014-01-01','yyyy-MM-dd'), 20),
partition P_2013_MAX values less than (to_date('2014-01-01','yyyy-MM-dd'), MAXVALUE),
partition P_MAX values less than (MAXVALUE,MAXVALUE)
);
INSERT INTO T_TEST VALUES (1,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (12,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (32,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (2,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (12,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (33,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (3,TO_DATE('20141204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (23,TO_DATE('20141204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (43,TO_DATE('20151204 00:00:00','YYYYMMDD HH24:MI:SS'));
SELECT * FROM T_TEST;
SELECT * FROM T_TEST PARTITION(P_2012_10);
SELECT * FROM T_TEST PARTITION(P_2012_20);
SELECT * FROM T_TEST PARTITION(P_2012_MAX);
SELECT * FROM T_TEST PARTITION(P_2013_10);
SELECT * FROM T_TEST PARTITION(P_2013_20);
SELECT * FROM T_TEST PARTITION(P_2013_MAX);
SELECT * FROM T_TEST PARTITION(P_MAX);
J. oracle分區是怎樣優化資料庫的
1、1、調整數據結構的設計。這一部分在開發信息系統之前完成,程序員需要考慮是否使用ORACLE資料庫的分區功能,對於經常訪問的資料庫表是否需要建立索引等。
2、2、調整應用程序結構設計。這一部分也是在開發信息系統之前完成,程序員在這一步需要考慮應用程序使用什麼樣的體系結構,是使用傳統的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程序體系結構要求的資料庫資源是不同的。
3、3、調整資料庫SQL語句。應用程序的執行最終將歸結為資料庫中的SQL語句執行,因此SQL語句的執行效率最終決定了ORACLE資料庫的性能。ORACLE公司推薦使用ORACLE語句優化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調整優化SQL語句。