海量数据库及分区4——《12年资深DBA教你Oracle开发与优化——性能优化部分》...
生活随笔
收集整理的這篇文章主要介紹了
海量数据库及分区4——《12年资深DBA教你Oracle开发与优化——性能优化部分》...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄:
Oracle數據完整性和鎖機制? 索引及優化之表分析? 表分析、約束及表間關系? Oracle體系結構1 Oracle體系結構2? 海量數據庫及分區1? 海量數據庫及分區2? 海量數據庫及分區3? 海量數據庫及分區4? 高級SQL優化(一)?? 高級SQL優化(二)?? 高級SQL優化(三) 常用優化工具? PPT和源碼下載:???http://***/forum/posts/list/6365.html 配套視頻課程 Oracle性能優化?http://***/product/601? 海量數據庫和高級SQL優化?http://***/product/602 管理分區 增加索引分區 本地索引無法明確的增加分區,其增加只能是基表增加分區,此時新增加的索引分區的名字是Oracle自命名的,但可以給其重新命名。 也可是使用ALTER INDEX index_name MODIFY DEFAULT ARRTIBUTES? TABLASEPACE tablespace_name修改本地索引分區默認的表空間后,再使用ADD PARTITION增加表的分區,則基表增加分區帶來索引分區的增加,會自動將新增加的索引分區指向該表空間。 接合分區 分區接合是針對散列分區或者*-散列子分區的,目的是減少分區數。當某個散列分區接合后,Oracle將其分區的數據分散到其它分區中。被接合的分區是由數據庫選擇的,接合完成后該分區會被刪除,且如果沒有使用UPDATE INDEX子句,本地索引和全局索引均將變成不可用,一般需要重建索引。 1.散列分區表的散列分區接合 使用語法 ALTER TABLE? COALESCE PARTITION。 ? 2.散列子分區表的散列子分區集合 使用語法 ALTER TABLE MODIFY PARTITION? COALESCE SUBPARTITION。 ??????????????????????參見附件腳本1 刪除表分區 只針對范圍和列表分區或者組合*-范圍和組合*-列表分區,散列分區不能刪除,替代的方式是接合分區。 分區或子分區刪除后,其中的數據也被刪除,同樣,基于這些分區或者子分區的本地索引中相應的分區和子分區也會被刪除;對于全局索引除非使用了UPDATE INDEXS子句,刪除分區后其會變成不可用,一般需要重構。如果要防止數據被刪除替代的方式是使用合并分區MERGE PARTITION。 刪除分區的語句是ALTER TABLE DROP PARTITION,刪除子分區的語句時ALTER TABLE DROP SUBPARTITION。 1.從包含數據和全局索引的表中刪除分區 ? 此時指的是表中有數據,且包含一個或幾個全局索引。 (1).方法一(推薦的方法) 先刪除分區,再一個個的重構全部索引,此時可以解決范圍分區的全局索引的問題(刪除后全部變成不可用)。這么做的原因是不要考慮全局索引是什么分區的。一般的方法是編寫一個工具子程序,通過動態SQL開重構索引: ALTER TABLE table_name DROP PARTITION partition_name; ALTER INDEX index_name1_on_ table_name REBUILD; … ALTER INDEX index_namen_on_ table_name REBUILD; (2).方法二 先刪除該分區的數據(因為刪除數據會重構全局分區),再刪除分區,一般針對數據不是特別多的表: DELETE FROM table_name PARTITION(partition_name); ALTER TABLE table_name? PARTITION partition_name; (3).方法三 使用UPDATE INDEXES子句,此時Oracle會自動重構該全局索引: ALTER TABLE table_name? PARTITION partition_name UPDATE INDEXES; 2.從包含數據和參照完整性(外鍵)的表中刪除分區 ? (1).方法一 如果要刪除的分區中的數據沒有被參照引用,先禁用該參照完整性約束,再刪除分區,最后再啟用該參照完整性約束。 (2).方法二 如果要刪除的分區中的數據被參照引用,先刪除該分區中數據,再刪除分區。 刪除索引分區 無法顯式的刪除本地索引的分區,刪除的唯一方式是本地索引分區基表的分區被刪除時由Oracle自動的隱式刪除。如果全局索引分區是空的,則可以顯式的刪除它,使用的語句是ALTER INDEX index_name DROP PARTITION partition_name。但是,如果全局索引分區包含數據,刪除則會引起更高級的分區(即下一個分區)變得不可用。如果非要這么做,則對更高級的分區需要重構,語法是: ALTER INDEX index_name REUBILT PARTITION nextpartition_name 交換分區 可以將一個分區(子分區)和非分區表進行數據交換,oracle交換的方法是其實是對邏輯存儲段進行交換。同樣,散列|范圍|列表分區可以與復合*-散列|*-范圍|*-列表分區間也可以進行數據交換。當應用中需要將非分區表的數據轉換進入分區表的分區時非常高效實用。使用INCLUDEING INDEXES子句可以同步將本地索引也進行交換,使用WITH VALIDATATION子句還可以實現行數據的驗證。 交換分區時如果不帶UPDATE INDEXES子句,則全局索引或全局索引基于的分區將變為不可用。 1.三種單級分區與非分區表的交換 使用ALTER TABLE table_name EXCHANGE PARTITION partition_name WITH TABLE nonpartition_name 交換前: ? 1.三種單級分區與非分區表的交換 交換后: 如再次交換,則二者的數據會再次互換,變成第一次交換前的狀態 ? 2. 單級散列分區表與復合*-散列分區的交換 此時要求單級散列分區表的分區鍵與復合*-散列分區表的子分區鍵相同,且兩個交換的散列分區數也得相同,此外也不能指定單級散列分區表的某一個分區進行交換。 交換前: 2. 單級散列分區表與復合*-散列分區的交換 交換后: 再交換后,回到原始狀態: 參見附件腳本3 ? 3. 復合*-散列分區中的散列子分區交換 使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分區表進行交換,且只能跟非分區表進行交換。 參見附件腳本4 交換前: 交換后: 4.單級列表分區表與復合*-列表分區的交換 此時要求List分區表的分區鍵和*-List表的子分區鍵相匹配,前者的List分區數與后者的List子分區相同。 參見附件腳本5 5. 復合*-列表分區中的列表子分區交換 同樣也是使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分區表進行交換,且只能跟非分區表進行交換。 參見附件腳本6 6.單級范圍分區表與復合*-范圍分區的交換 此時要求Range分區表的分區鍵和*-Range表的子分區鍵相匹配,前者的Range分區數與后者的Range子分區相同。 參見附件腳本7 7. 復合*-范圍分區中的范圍子分區交換 ??? 同樣也是使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分區表進行交換,且只能跟非分區表進行交換。 參見附件腳本 列表分區值的增加? 僅有列表分區或列表子分區存在該功能,如果要增加的值在其它分區或者當前分區的其它子分區中存在,則不能增加,因此對于存在default的List分區/子分區,本功能不可用。本操作完成后,本地索引和全局索引保留為可用。 參 見附件腳本9? 1.列表分區 ALTER TABLE table_name MODIFY PARTITION partition_name ADD VALUES 2.列表子分區 ALTER TABLE table_name MODIFY SUBPARTITION subpartition_name ADD VALUES 列表分區值的刪除 也是僅有列表分區或列表子分區存在該功能,如果要刪除的值在當前分區子分區中存在,則不能報錯,必須先刪除該值對應的記錄才能再刪除,如果一個分區中只有一個值,無論其有否數據,也不能刪除該值,因此對于存在default的List分區/子分區,本功能不可用。本操作完成后,本地索引和全局索引保留為可用。 參見附件腳本10 1.列表分區 ALTER TABLE table_name MODIFY PARTITION partition_name DROP VALUES 2.列表子分區 ALTER TABLE table_name MODIFY SUBPARTITION subpartition_name DROP VALUES 移動分區 移動分區的作用包括: l重新聚合數據,以減少碎片 l將分區移動到另外一個表空間(MODIFY命令搞不定) l修改“建立時間”屬性 l對有壓縮屬性的,將數據壓縮后存儲,因此對壓縮分區表分寫入后需要調用本命令 一般來說,該命令執行完后,本地索引和全局索引變成不可用,需要重新構建。 1.移動表分區 ALTER TABLE table_name MOVE PARTITION partition_name [TABLESPACE new_tablespace_name][NOLOGGING|LOGGING][COMPRESS] 1.移動表分區 ALTER TABLE table_name MOVE PARTITION partition_name [TABLESPACE new_tablespace_name][NOLOGGING|LOGGING][COMPRESS]; 執行該命令后,即使沒有指定新的表空間,也會刪除舊的分區段,創建一個新的分區段。 2.移動子分區 針對復合分區表,同上,關鍵字改成SUBPARTIOTION? subpartition_name,此外此時只能移動子分區,對分區的移動是非法的。 3.移動索引分區 切記不要通過MOVE指令來執行,雖然Oracle支持,建議一律先刪除索引再重建。 參見附件腳本11 ? ? 重構索引分區 重構索引分區的理由一般包括: l恢復空間或改善性能 l修復因介質原因而損壞的索引分區 l通過SQL*Loader或導入工具裝載數據后重構本地索引 l重構被標記為UNUSABLE的索引分區 l啟用b-tree索引中的鍵壓縮 1.重構全局索引分區 有以下兩種方法: (1).ALTER INDEX index_name REBUILD PARTITION partition_name (2).刪除索引,再重建。推薦這種方法 ? 參見附件腳本12.1 ? 2.重構本地索引分區?參見附件腳本12.2 有以下兩種方法: (1).ALTER INDEX index_name? REBUILD {PARTITION partition_name| SUBPARTITION subpartition_name} (2). ALTER TABLE table_name? MODIFY [{PARTITION partition_name| SUBPARTITION subpartition_name} REBUILD UNUSABLE LOCAL INDEXES 重命名分區 使用重命名分區有兩種需求,一種是將分區名改成更有意義的,第二種是將系統自動生成的分區名改成自己想要的名字。 1.重命名分區/子分區 ALTER TABLE table_name RENAME PARTITION old_name TO new_name; ALTER TABLE table_name RENAME SUBPARTITION old_name TO new_name; 2.重索引分區 除關鍵字改成ALTER TABLE table_name 改成ALTER INDEX index_name外,其它同重命名分區/子分區 參見附件腳本13 拆分分區 當一個分區變得很大時會帶來備份、恢復和維護操作的長時性,此時可以對分區進行拆分,拆分可以將一個分區拆分成兩個,拆分的分區如果包含數據,完成拆分后索引會變得不可用,一般需要重構。 1.拆分Range分區表的Range分區 ALTER TABLE table_name SPLIT PARTITION partition_name AT(values) INTO(PARTITION new_ partition_name1,??????????????????? PARTITION new_partition_name2); 其中拆分完分區后的第一個分區的值小于AT值,第二個小于原來分區的值。如果拆分完的分區沒有指定名字,系統使用SYS_Pn自動命名。拆分完成后如果存在索引,還需要重構。 參見附件腳本14.1 2.拆分List分區表的List分區 ALTER TABLE table_name SPLIT PARTITION partition_name VALUES(values) INTO(PARTITION new_ partition_name1,??????????????????? PARTITION new_partition_name2); 其中values值是定義中枚舉值范圍的子集,該值寫入到拆分后的第一個分區,未包含的寫入到第二個分區。也可以對default分區進行拆分,方法同上。 參見附件腳本14.2 3.拆分*-hash分區表的的分區 ? 子分區可以采用SUBPARTITIONS n方式,也可以采用PARTITION partition_name方式。如果不指定SUBPARTITION子句,則從父分區去繼承子分區數。需要注意的是拆分時繼承的屬性與合并時不同,合并時繼承的是表級的屬性,原因是合并時有兩個父分區。其中關鍵字values或at取決于分區的類型,即range為at,list為values 參見附件14.3 4.拆分*-List分區表的分區 此時分區級和子分區級均可拆分 (1).拆分*-List分區 如果是R-L類型,則與拆分范圍分區類似,如果是L-L類型,則跟拆分列表分區類似。無需指定子分區語句,子分區屬性從拆分的父分區處繼承,此時拆分后新子分區的名字無法指定。 (2).拆分*-List子分區 ALTER TABLE table_name SPLIT SUBPARTITION subpartition_name VALUES(values) INTO(SUBPARTITION new_subpartition_name1,??????????????????? SUBPARTITION new_subpartition_name2); 參見附件腳本14.4 5.拆分*-Range分區表的分區?? 參見附件腳本14.5 此時也是分區級和子分區級均可拆分,新分區的子分區的范圍值不可指定,新分區的子分區屬性繼承自父分區。 (1).拆分*-Range分區 如果是R-R類型,則與拆分范圍分區類似,如果是L-R類型,則跟拆分列表分區類似。無需指定子分區語句,子分區屬性從拆分的父分區處繼承,此時拆分后新子分區的名字無法指定。 (2).拆分*-Range子分區 ALTER TABLE table_name SPLIT SUBPARTITION subpartition_name AT(values) INTO(SUBPARTITION new_subpartition_name1,??????????????????? SUBPARTITION new_subpartition_name2); 6.拆分索引分區 本地索引分區無法顯式的拆分,其拆分的唯一途徑是基表的分區拆分時由Oracle隱式的進行拆分。 全局索引分區可以拆分,拆分完成后需要重構,但我們不推薦這么做,如下例: ALTER INDEX quon1 SPLIT PARTITION canada AT ( 100 ) INTO PARTITION canada1 ..., PARTITION canada2 ...); ALTER INDEX quon1 REBUILD PARTITION canada1; ALTER INDEX quon1 REBUILD PARTITION canada2; 清空分區 使用ALTER TABLE table_name TRUNCATE {PARTITION partition_name| SUBPARTITION subpartition_name}清空分區會清除掉分區中的數據,類似清空表。但是索引分區不可清空,清空分區同步會清空索引分區在該分區的數據。 1.清空表分區 會清空分區數據,但不會回收空間,有兩種情況: (1).包含數據和全局索引的分區 方法一是先清空該分區再重構基于該分區的全局索引;第二種方法是先刪除該分區的數據再清空該分區;第三種方法是使用UPDATE INDEXES子句。推薦第二種方式。 1.清空表分區 (2).包含數據和代參考完整性約束的分區 方法一先禁用該約束再清空分區最后啟用該約束;第二種方法是先刪除該分區的數據再清空該分區。推薦第一種方式。 2.清空子分區 直接使用該語句,同步的本地索引數據也會刪除。 相關數據字典
| 視圖 | 說明 | 視圖 | 說明 |
| DBA_PART_TABLES ALL_PART_TABLES USER_PART_TABLES | 分區表 | DBA_TAB_PARTITIONS ALL_TAB_PARTITIONS USER_TAB_PARTITIONS | 分區 |
| DBA_TAB_SUBPARTITIONS ALL_TAB_SUBPARTITIONS USER_TAB_SUBPARTITIONS | 子分區 | DBA_PART_KEY_COLUMNS ALL_PART_KEY_COLUMNS USER_PART_KEY_COLUMNS | 分區鍵 |
| DBA_SUBPART_KEY_COLUMNS ALL_SUBPART_KEY_COLUMNS USER_SUBPART_KEY_COLUMNS | 子分區鍵 | DBA_PART_COL_STATISTICS ALL_PART_COL_STATISTICS USER_PART_COL_STATISTICS | 分區的列和柱狀圖統計信息 |
| 視圖 | 說明 | 視圖 | 說明 |
| DBA_SUBPART_COL_STATISTICS ALL_SUBPART_COL_STATISTICS USER_SUBPART_COL_STATISTICS | 子分區的列和柱狀圖統計信息 | DBA_PART_HISTOGRAMS ALL_PART_HISTOGRAMS USER_PART_HISTOGRAMS | 分區柱狀圖數據 |
| DBA_SUBPART_HISTOGRAMS ALL_SUBPART_HISTOGRAMS USER_SUBPART_HISTOGRAMS | 子分區柱狀圖數據 | DBA_PART_INDEXES ALL_PART_INDEXES USER_PART_INDEXES | 分區索引 |
轉載于:https://www.cnblogs.com/liuzhuqing/archive/2013/02/04/7480623.html
總結
以上是生活随笔為你收集整理的海量数据库及分区4——《12年资深DBA教你Oracle开发与优化——性能优化部分》...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动化测试和性能测试工具的区别
- 下一篇: 多线程java_初学Java要注意什么