隨筆-86  評論-33  文章-0  trackbacks-0

          Oracle提供了分區(qū)技術(shù)以支持VLDB(Very Large DataBase)。分區(qū)表通過對分區(qū)列的判斷,把分區(qū)列不同的記錄,放到不同的分區(qū)中。分區(qū)完全對應(yīng)用透明。


          Oracle的分區(qū)表可以包括多個(gè)分區(qū),每個(gè)分區(qū)都是一個(gè)獨(dú)立的段(SEGMENT),可以存放到不同的表空間中。查詢時(shí)可以通過查詢表來訪問各個(gè)分區(qū)中的數(shù)據(jù),也可以通過在查詢時(shí)直接指定分區(qū)的方法來進(jìn)行查詢。


          分區(qū)提供以下優(yōu)點(diǎn):


          由于將數(shù)據(jù)分散到各個(gè)分區(qū)中,減少了數(shù)據(jù)損壞的可能性;


          可以對單獨(dú)的分區(qū)進(jìn)行備份和恢復(fù);


          可以將分區(qū)映射到不同的物理磁盤上,來分散IO;


          提高可管理性、可用性和性能。


          Oracle提供了以下幾種分區(qū)類型:


          范圍分區(qū)(range);


          哈希分區(qū)(hash);


          列表分區(qū)(list);


          范圍-哈希復(fù)合分區(qū)(range-hash);


          范圍-列表復(fù)合分區(qū)(range-list)。

           

          索引也可以進(jìn)行分區(qū),分區(qū)索引有兩種類型:global和local。對于local索引,每一個(gè)表分區(qū)對應(yīng)一個(gè)索引分區(qū),當(dāng)表的分區(qū)發(fā)生變化時(shí),索引的維護(hù)由Oracle自動(dòng)進(jìn)行。對于global索引,可以選擇是否分區(qū),而且索引的分區(qū)可以不與表分區(qū)相對應(yīng)。當(dāng)對分區(qū)進(jìn)行維護(hù)操作時(shí),通常會導(dǎo)致全局索引的INVALDED,必須在執(zhí)行完操作后REBUILD。Oracle9i提供了UPDATE GLOBAL INDEXES語句,可以使在進(jìn)行分區(qū)維護(hù)的同時(shí)重建全局索引。

          全局索引可以包含多個(gè)分區(qū)的值 局部索引比全局索引容易管理,而全局索引比較快
          注意:不能為散列分區(qū) 或者 子分區(qū)創(chuàng)建全局索引

          如果表中預(yù)期的數(shù)據(jù)量較大,通常都需要考慮使用分區(qū)表,確定使用分區(qū)表后,還要確定什么類型的分區(qū)(range partition、hash partition、list partition等)、分區(qū)區(qū)間大小等。分區(qū)的創(chuàng)建最好與程序有某種默契,偶曾經(jīng)創(chuàng)建分區(qū)表,按自然月份定義分區(qū)的,但程序卻在查詢時(shí)默認(rèn)的開始時(shí)間與結(jié)束時(shí)間是:當(dāng)前日期-30至當(dāng)前日期,比如當(dāng)天是9.18號,那查詢條件被產(chǎn)生為8.18-9.18,結(jié)果分區(qū)后并不沒有大幅提高性能,后來對程序的查詢?nèi)掌谧隽苏{(diào)整,按自然月查詢,系統(tǒng)的負(fù)載小了很多。

          從Oracle8.0開始支持表分區(qū)(MSSQL2005開始支持表分區(qū))。

          Oracle9i 分區(qū)能夠提高許多應(yīng)用程序的可管理性、性能與可用性。分區(qū)可以將表、索引及索引編排表進(jìn)一步劃分,從而可以更精細(xì)地對這些數(shù)據(jù)庫對象進(jìn)行管理和訪問。Oracle 提供了種類繁多的分區(qū)方案以滿足所有的業(yè)務(wù)需要。另外,由于在 SQL 語句中是完全透明的,所以分區(qū)可以用于幾乎所有的應(yīng)用程序。

          分區(qū)表允許將數(shù)據(jù)分成被稱為分區(qū)甚至子分區(qū)的更小的更好管理的塊。索引也可以這么分區(qū)。每個(gè)分區(qū)可以被單獨(dú)管理,可以不依賴于其他分區(qū)而單獨(dú)發(fā)揮作用,因此提供了一個(gè)更有利于可用性和性能的結(jié)構(gòu)。

          分區(qū)可以提高可管理性、性能與可用性,從而給各種各樣的應(yīng)用程序帶來極大的好處。通常,分區(qū)可以使某些查詢以及維護(hù)操作的性能大大提高。此外,分區(qū)還能夠在很大程度上簡化日常管理任務(wù)。分區(qū)還使數(shù)據(jù)庫設(shè)計(jì)人員和管理員能夠解決尖端應(yīng)用程序帶來的最難的問題。分區(qū)是建立上億萬字節(jié)數(shù)據(jù)系統(tǒng)或需要極高可用性系統(tǒng)的關(guān)鍵工具。

          在多CPU配置環(huán)境下,如果打算使用并行執(zhí)行,則分區(qū)提供了另一種并行的方法。通過給表或索引的不同分區(qū)分配不同的并行執(zhí)行服務(wù)器,就可以并行執(zhí)行對分區(qū)表和分區(qū)索引的操作。

          表或索引的分區(qū)和子分區(qū)都共享相同的邏輯屬性。例如表的所有分區(qū)或子分區(qū)共享相同的列和約束定義,一個(gè)索引的分區(qū)或子分區(qū)共享相同的索引選項(xiàng)。然而它們可以具有不同的物理屬性如表空間。

          盡管不需要將表或索引的每個(gè)分區(qū)或子分區(qū)放在不同的表空間,但這樣做更好。將分區(qū)存儲到不同的表空間能夠

          l 減少數(shù)據(jù)在多個(gè)分區(qū)中沖突的可能性

          l 可以單獨(dú)備份和恢復(fù)每個(gè)分區(qū)

          l 控制分區(qū)與磁盤驅(qū)動(dòng)器之間的映射對平衡I/O 負(fù)載是重要的

          l 改善可管理性可用性和性能

          分區(qū)操作對現(xiàn)存的應(yīng)用和運(yùn)行在分區(qū)表上的標(biāo)準(zhǔn)DML 語句來說是透明的。但是可以通過在DML 中使用分區(qū)擴(kuò)展表或索引的名字來對應(yīng)用編程,使其利用分區(qū)的優(yōu)點(diǎn)。

          可以使用SQL*Loader、Import 和Export 工具來裝載或卸載分區(qū)表中的數(shù)據(jù)。這些工具都是支持分區(qū)和子分區(qū)的。

          分區(qū)的方法Oracle9i 提供了如下5種分區(qū)方法:

           

          l 范圍分區(qū)Range

          l 散列分區(qū)Hash

          l 列表分區(qū)List

          l 組合范圍-散列分區(qū)Range-Hash

          l 組合范圍-列表分區(qū)Range-List

          可對索引和表分區(qū)。全局索引只能按范圍分區(qū),但可以將其定義在任何類型的分區(qū)或非分區(qū)表上。通常全局索引比局部索引需要更多的維護(hù)。

          一般組建局部索引,以便反映其基礎(chǔ)表的結(jié)構(gòu)。它與基礎(chǔ)表是等同分區(qū)的,即它與基礎(chǔ)

          表在同樣的列上分區(qū),創(chuàng)建同樣數(shù)量的分區(qū)或子分區(qū),設(shè)置與基礎(chǔ)表相對應(yīng)的同樣的分區(qū)邊界。對局部索引而言,當(dāng)維護(hù)活動(dòng)影響分區(qū)時(shí),會自動(dòng)維護(hù)索引分區(qū)。這保證了索引與基礎(chǔ)表之間的等同分區(qū)。

          關(guān)于范圍分區(qū)Range:

          要想將行映射到基于列值范圍的分區(qū),就使用范圍分區(qū)方法。當(dāng)數(shù)據(jù)可以被劃分成邏輯范圍時(shí)如年度中的月份,這種類型的分區(qū)就有用了。當(dāng)數(shù)據(jù)在整個(gè)范圍中能被均等地劃分時(shí)性能最好。如果靠范圍的分區(qū)會由于不均等的劃分而導(dǎo)致分區(qū)在大小上明顯不同時(shí),就需要考慮其他的分區(qū)方法。

          關(guān)于散列分區(qū)Hash:

          如果數(shù)據(jù)不那么容易進(jìn)行范圍分區(qū),但為了性能和管理的原因又想分區(qū)時(shí),就使用散列分區(qū)方法。散列分區(qū)提供了一種在指定數(shù)量的分區(qū)中均等地劃分?jǐn)?shù)據(jù)的方法。基于分區(qū)鍵的散列值將行映射到分區(qū)中。創(chuàng)建和使用散列分區(qū)會給你提供了一種很靈活的放置數(shù)據(jù)的方法,因?yàn)槟憧梢酝ㄟ^在I/O 驅(qū)動(dòng)器之間播撒(摘掉)這些均等定量的分區(qū),來影響可用性和性能。

          關(guān)于列表分區(qū)List:

          當(dāng)你需要明確地控制如何將行映射到分區(qū)時(shí),就使用列表分區(qū)方法。可以在每個(gè)分區(qū)的描述中為該分區(qū)列指定一列離散值,這不同于范圍分區(qū),在那里一個(gè)范圍與一個(gè)分區(qū)相關(guān),這也不同于散列分區(qū),在那里用戶不能控制如何將行映射到分區(qū)。列表分區(qū)方法是特意為遵從離散值的模塊化數(shù)據(jù)劃分而設(shè)計(jì)的。范圍分區(qū)或散列分區(qū)不那么容易做到這一點(diǎn)。進(jìn)一步說列表分區(qū)可以非常自然地將無序的和不相關(guān)的數(shù)據(jù)集進(jìn)行分組和組織到一起。

          與范圍分區(qū)和散列分區(qū)所不同,列表分區(qū)不支持多列分區(qū)。如果要將表按列分區(qū),那么分區(qū)鍵就只能由表的一個(gè)單獨(dú)的列組成,然而可以用范圍分區(qū)或散列分區(qū)方法進(jìn)行分區(qū)的所有的列,都可以用列表分區(qū)方法進(jìn)行分區(qū)。

          關(guān)于組合范圍-散列分區(qū):

          范圍和散列技術(shù)的組合,首先對表進(jìn)行范圍分區(qū),然后用散列技術(shù)對每個(gè)范圍分區(qū)再次分區(qū)。給定的范圍分區(qū)的所有子分區(qū)加在一起表示數(shù)據(jù)的邏輯子集。

          關(guān)于組合范圍-列表分區(qū):

          范圍和列表技術(shù)的組合,首先對表進(jìn)行范圍分區(qū),然后用列表技術(shù)對每個(gè)范圍分區(qū)再次分區(qū)。與組合范圍-散列分區(qū)不同的是,每個(gè)子分區(qū)的所有內(nèi)容表示數(shù)據(jù)的邏輯子集,由適當(dāng)?shù)姆秶土斜矸謪^(qū)設(shè)置來描述。

          創(chuàng)建或更改分區(qū)表時(shí)可以指定行移動(dòng)子句,即ENABLE ROW MOVEMENT 或者DISABLE ROW MOVEMENT ,當(dāng)其鍵被更改時(shí),該子句啟用或停用將行遷移到一個(gè)新的分區(qū)。默認(rèn)值為DISABLE ROW MOVEMENT。本產(chǎn)品(項(xiàng)目)使用ENABLE ROW MOVEMENT子句。


          分區(qū)技術(shù)能夠提高數(shù)據(jù)庫的可管理性:

          使用分區(qū)技術(shù),維護(hù)操作可集中于表的特定部分。例如,數(shù)據(jù)庫管理員可以只對表的一部分做備份,而不必對整個(gè)表做備份。對整個(gè)數(shù)據(jù)庫對象的維護(hù)操作,可以在每個(gè)分區(qū)的基礎(chǔ)上進(jìn)行,從而將維護(hù)工作分解成更容易管理的小塊。

          分區(qū)技術(shù)提高可管理性的一個(gè)典型用法是支持?jǐn)?shù)據(jù)倉庫中的‘滾動(dòng)視窗’加載進(jìn)程。假設(shè)數(shù)據(jù)庫管理員每周向表中加載新數(shù)據(jù)。該表可以是范圍分區(qū),以便每個(gè)分區(qū)包含一周的數(shù)據(jù)。加載進(jìn)程只是簡單地添加新的分區(qū)。添加一個(gè)新分區(qū)的操作比修改整個(gè)表效率高很多,因?yàn)閿?shù)據(jù)庫管理員不需要修改任何其他分區(qū)。從分區(qū)后的表中去除數(shù)據(jù)也是一樣。你只要用一個(gè)很簡便快捷的數(shù)據(jù)字典操作刪掉一個(gè)分區(qū),而不必發(fā)出使用大量資源和調(diào)動(dòng)所有要?jiǎng)h除的數(shù)據(jù)的 ‘DELETE’ 命令。

          分區(qū)技術(shù)能夠提高數(shù)據(jù)庫的性能:

          由于減少了所檢查或操作的數(shù)據(jù)數(shù)量,同時(shí)允許并行執(zhí)行,Oracle9i 的分區(qū)功能提供了性能上的優(yōu)勢。這些性能包括:

          l 分區(qū)修整:分區(qū)修整是用分區(qū)技術(shù)提高性能的最簡單最有價(jià)值的手段。分區(qū)修整常常能夠?qū)⒉樵冃阅芴岣邘讉€(gè)數(shù)量級。例如,假定應(yīng)用程序中有包含定單歷史記錄的定單表,該表用周進(jìn)行了分區(qū)。查詢一周的定單只需訪問該定單表的一個(gè)分區(qū)。如果該定單表包含兩年的歷史記錄,這個(gè)查詢只需要訪問一個(gè)而不是一百零四個(gè)分區(qū)。該查詢的執(zhí)行速度因?yàn)榉謪^(qū)修整而有可能快一百倍。分區(qū)修整能與所有其他 Oracle 性能特性協(xié)作。Oracle 公司將把分區(qū)修整技術(shù)與索引技術(shù)、連結(jié)技術(shù)和并行訪問方法一起聯(lián)合使用。

          l 分區(qū)智能聯(lián)接:分區(qū)功能可以通過稱為分區(qū)智能聯(lián)接的技術(shù)提高多表聯(lián)接的性能。當(dāng)兩個(gè)表要聯(lián)接在一起,而且每個(gè)表都用聯(lián)接關(guān)鍵字來分區(qū)時(shí),就可以使用分區(qū)智能聯(lián)接。分區(qū)智能聯(lián)接將大型聯(lián)接分解成較小的發(fā)生在各個(gè)分區(qū)間的聯(lián)接,從而用較少的時(shí)間完成全部聯(lián)接。這就給串行和并行的執(zhí)行都能帶來顯著的性能改善。

          l 更新和刪除的并行執(zhí)行:分區(qū)功能能夠無限地并行執(zhí)行 UPDATE、DELETE 與 MERGE 語句。當(dāng)訪問分區(qū)或未分區(qū)的數(shù)據(jù)庫對象時(shí)Oracle 將并行處理 SELECT 與 INSERT 語句。當(dāng)不使用位圖索引時(shí),也可以對分區(qū)或未分區(qū)的數(shù)據(jù)庫對象并行處理 UPDATE、DELETE 和 MERGE 語句。為了對有位圖索引的對象并行處理那些操作,目標(biāo)表必須先分區(qū)。這些 SQL 語句的并行執(zhí)行可以大大提高性能,特別是提高 UPDATE 與 DELETE 或 MERGE 操作涉及大量數(shù)據(jù)時(shí)的性能。

          分區(qū)技術(shù)提高可用性:

          分區(qū)的數(shù)據(jù)庫對象具有分區(qū)獨(dú)立性。該分區(qū)獨(dú)立性特點(diǎn)可能是高可用性戰(zhàn)略的一個(gè)重要部分,例如,如果分區(qū)表的分區(qū)不能用,但該表的所有其他分區(qū)仍然保持在線并可用。那么這個(gè)應(yīng)用程序可以繼續(xù)針對該分區(qū)表執(zhí)行查詢和事務(wù)處理,只要不是訪問那個(gè)不可用的分區(qū),數(shù)據(jù)庫操作仍然能夠成功運(yùn)行。 數(shù)據(jù)庫管理員可以指定各分區(qū)存放在不同的表空間里,從而讓管理員獨(dú)立于其它表分區(qū)針對每個(gè)分區(qū)進(jìn)行備份與恢復(fù)操作。 還有,分區(qū)功能可以減少計(jì)劃停機(jī)時(shí)間。性能由于分區(qū)功能得到了改善,使數(shù)據(jù)庫管理員在相對較小的批處理窗口完成大型數(shù)據(jù)庫對象的維護(hù)工作。

          Oracle最大允許存在多少個(gè)分區(qū)呢?

          我們可以從Oracle的Concepts手冊上找到這個(gè)信息,對于Oracle9iR2:

          Tables can be partitioned into up to 64,000 separate partitions.

          對于Oracle10gR2,Oracle增強(qiáng)了分區(qū)特性:

          Tables can be partitioned into up to 1024K-1 separate partitions.

          關(guān)于何時(shí)應(yīng)該進(jìn)行分區(qū),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.

          posted on 2008-06-11 12:43 Derek.Guo 閱讀(1019) 評論(0)  編輯  收藏 所屬分類: Database
          MSN:envoydada@hotmail.com QQ:34935442
          主站蜘蛛池模板: 延安市| 城市| 涞源县| 宜宾县| 思茅市| 巴东县| 阿鲁科尔沁旗| 南雄市| 云南省| 双桥区| 汉中市| 九龙城区| 抚顺市| 三门县| 巴林左旗| 七台河市| 娱乐| 大新县| 德庆县| 南通市| 西城区| 夏津县| 梅河口市| 鹿泉市| 济源市| 乌审旗| 长宁县| 喀喇沁旗| 宜宾县| 观塘区| 汤阴县| 昌黎县| 长丰县| 阳信县| 宜宾县| 蒙自县| 玉溪市| 简阳市| 香格里拉县| 巴马| 教育|