oracle sql 分区查询语句_Oracle 分区概述
一. 概念
分區(qū)是將一個表或者索引物理地分解成多個更小的部分。對于訪問數(shù)據(jù)庫的應(yīng)用來看,邏輯上看只有一個表或者索引,因為訪問和普通表或索引一模一樣。但物理上這個表可能被分成了數(shù)十個獨立的分區(qū),每一個分區(qū)都是獨立的對象,可以獨自處理。
二. 如何區(qū)分數(shù)據(jù)
分區(qū)主要有利于非常大的表和索引,將一個大表或者索引分成很多獨立的小部分更容易進行處理。那么按照什么樣的規(guī)則將數(shù)據(jù)進行分區(qū)?換言之,你怎么知道這條數(shù)據(jù)放A分區(qū),那條數(shù)據(jù)放B分區(qū)。oracle中是根據(jù)分區(qū)鍵決定的,分區(qū)鍵有可能是通過某一個函數(shù)算出來的。
三. 分區(qū)的好處
1. 提高數(shù)據(jù)的可用性
這個很容易理解,數(shù)據(jù)被分成了多個獨立的部分,假如某一分區(qū)的數(shù)據(jù)出現(xiàn)問題,不會影響整個數(shù)據(jù)的訪問。因為假如我這次訪問的數(shù)據(jù)不在這個問題分區(qū),還是可以正常執(zhí)行。
為了展示這種可用性的提高,我們將建立一個散列分區(qū)表,其中有兩個分區(qū),分別在單獨的表空間中。這里將創(chuàng)建一個EMP表,它在EMPNO列上指定了一個分區(qū)鍵(EMPNO就是我們的分區(qū)鍵)SQL如下:
create table emp
(empno int,
ename varchar2(20)
)
partition by hash(empno)
(partition part_1 tablespace nnc_data01,
partition part_2 tablespace nnc_data02
);
insert into emp select empno, ename from scott.emp;
select * from emp partition(part_1);
select * from emp partition(part_2);
我們會看到最后兩個查詢會查到兩個分區(qū)都有數(shù)據(jù),而且數(shù)據(jù)是隨機地分布在每個分區(qū)上,沒有什么規(guī)律。這主要采用的是散列分區(qū)方式,通過計算empno的散列值來確定將數(shù)據(jù)放在哪個分區(qū)。接著運行如下sql語句:
alter tablespace p1 offline;
select * from emp;
variable n number
exec :n := 7844;
select * from emp where empno = :n;
我們會看到最后一條查詢語句能夠執(zhí)行成功,第二條查詢語句執(zhí)行失敗。因為第二條查詢語句需要訪問分區(qū)p1,但是p1已經(jīng)不可訪問。最后一條查詢語句只要訪問p2分區(qū),故p1分區(qū)可以不可以訪問不會影響它的執(zhí)行。
另外,分區(qū)還可以通過減少停機時間來提高可用性。例如,如果有一個100GB的表,它劃分為50個2GB的分區(qū),這樣就能更快地從錯誤中恢復(fù)。如果某個2GB的分區(qū)遭到破壞,現(xiàn)在恢復(fù)的時間就只是恢復(fù)一個2GB分區(qū)所需的時間,而不是恢復(fù)一個100GB表的時間。
2. 減少管理負擔
這是因為與在一個大對象上執(zhí)行操作相比,在小對象上執(zhí)行同樣的操作從本質(zhì)上講更為容易、速度更快,而且占用的資源也更少。
例如,假設(shè)數(shù)據(jù)庫中有一個10GB的索引。如果需要重建這個索引,而該索引未分區(qū),你就必須將整個10GB的索引作為一個工作單元來重建。盡管可以在線地重建索引,但是要完全重建完整的10GB索引,還是需要占用大量的資源。至少需要在某處有10GB的空閑存儲空間來存放兩個索引的副本,還需要一個臨時事務(wù)日志表來記錄重建索引期間對基表所做的修改。另一方面,如果將索引本身劃分為10個1GB的分區(qū),就可以一個接一個地單獨重建各個索引分區(qū)。現(xiàn)在只需要原先所需空閑空間的10%。另外請考慮以下情況:10GB索引的重建即將完成之前,如果出現(xiàn)系統(tǒng)或軟件故障會發(fā)生什么。我們所做的全部努力都會付諸東流。如果把問題分解,將索引劃分為1GB的分區(qū),你最多只會丟掉重建工作的10%。
3. 改善語句性能
分區(qū)最后一個好處體現(xiàn)在改進語句(SELECT、INSERT、UPDATE、DELETE、MERGE)的性能方面。我們來看兩類語句,一種是修改信息的語句,另一種是只讀取信息的語句。
1. 并行的修改語句(DML)
修改數(shù)據(jù)庫中數(shù)據(jù)的語句有可能會執(zhí)行并行DML(parallel DML,PDML)。采用PDML時,Oracle使用多個線程或進程來執(zhí)行INSERT、UPDATE或DELETE, 而不是執(zhí)行一個串行進程。在一個有充足I/O帶寬的多CPU主機上,對于大規(guī)模的DML操作,速度的提升可能相當顯著。在Oracle9i以前的版本中,PDML要求必須分區(qū)。如果你的表沒有分區(qū),在先前的版本中就不能并行地執(zhí)行這些操作。后續(xù)版本放開了限制。
2. 查詢性能
假如分區(qū)了,我們只需要查詢感興趣的分區(qū),不感興趣的分區(qū)就不查了,顯然能提高查詢速度
分享到:
2012-10-30 16:34
瀏覽 811
分類:數(shù)據(jù)庫
評論
總結(jié)
以上是生活随笔為你收集整理的oracle sql 分区查询语句_Oracle 分区概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编程基础知识点_12个关于P
- 下一篇: 多组测试数据(求和)IV