程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 關於分區技術的索引 index,分區索引index

關於分區技術的索引 index,分區索引index

編輯:Oracle教程

關於分區技術的索引 index,分區索引index


關於分區技術---索引 Index

 一、   分區索引分類:

    本地前綴分區索引(local prefixedpartitioned index)

    全局分區索引(global partitionedindex)

    本地非前綴分區索引(localnon-prefixed partitioned index)

 1.1  表和索引的組合:

 


第一種:表和索引都不分區 

    最簡單的方式  就是常見的索引

 

第二種:表分區了,但索引沒分區

    這導致了:“我們已經做了分區表了,怎麼性能沒有提高?”的主要原因之一。

在很多系統中,特別是交易系統裡面,是通過索引訪問數據庫的。如果索引沒有分區,索引樹的高度沒有變,因此訪問性能當然沒有提高。如果按索引訪問表,與表是否分區關系不大。

 

第三種:表沒有分區,但索引分區了

    索引只能是全局分區索引。

 

第四種:表分區了,索引也分區了(重點!!!)

    全局分區索引

    本地前綴分區索引

 

二、   具體介紹分區索引

 

本地分區索引

    是指索引的分區方法與對應表的分區方法一樣。

 

2.1本地前綴分區索引(local prefixed partitioned index)

是指分區字段是索引字段的前綴。

    一張交易流水表(TXN_CURRENT),並且以交易日期字段(TXN_DATE)按年度進行了范圍分區。在TXN_DATE 字段創建索引。

 

Createindex idx_txn_current_1 on txn_current(txn_date) local;

 

或者復合分區索引

Createindex idx_txn_current_2 on txn_current(txn_date,area) local;

 

    好處:

a. 由於分區索引和表分區對應,因此查詢數據直接到對應的索引分區去查詢,索引樹的高度肯定低於非分區情況下的那棵大索引樹了,也就是說性能更高了。

b. 當某個分區進行刪除(DROP)或合並(MERGE)操作之後,oracle自動對所對應的索引分區進行相同的操作,整個本地前綴索引依然有效,不需要重建(rebuild)操作,這樣大大保障了表的可用性。

 

2.2 全局分區索引(global partitioned index)

    索引的分區與表分區無關

 

    分區表按年份進行分區,在地區(AREA)字段上建立分區索引,

 


 

 

也就是說:杭州交易數據肯定可分布在各年份,湖州、嘉興交易數據同樣如此。

假如有這樣的查詢需求:

Select* from TXN_CURRENT where area=’05711001’;

--假設查詢杭州西湖區

 

好處:

a. 此時oracle會很聰明地知道杭州的分區索引樹上去檢索,索引高度肯定低於非分區情況下的大索引樹了,也就是性能更高了。

b. 在分區粒度比較細的情況下,性能甚至高於本地前綴分區索引。

 

不足:

a.  主要體現在高可用方面。如果該表的03年數據通過分區刪除全部刪除了。則全局分區索引(包括普通非分區索引)則全部失效(INVALID),這些索引不可 用了,除非重建(rebuild)操作。數據量越大,索引量也越大,重建索引時間也越長,無法通過該類索引訪問數據的時間也越長。因此,大大降低數據的可 訪問性。

 

2.3 本地非前綴分區索引

可能導致性能會下降的情況,本地非前綴分區索引的性能可能還不如不分區。

 

優點:

a. 提高按索 引訪問的可用性!我們假設要通過刪除分區技術,進行03年數據的清理,如果area字段索引建立成普通索引,或者是全局分區索引,都會面臨一個問題:在分 區刪除(DROP)操作之後,普通索引和全局分區索引都會失效(INVALID),必須重建。而本地非前綴分區索引的好處在於,在分區刪除操作後,該本地 非前綴分區索引依然有效。

 

三、   整理思路

 

理解分區索引藏寶圖:

 


 

描述藏寶圖:找寶藏

(1)如果表分區字段正好是索引字段或者是其前綴。例如:上述TXN_CURRENT 表分區字段是TXN_DATE,則TXN_DATE正好是索引字段(TXN_DATE),或者正好是索引字段(TXN_DATE,AREA)的前綴,則此 時應建立local profixedpartitioned index.

(2)否則,如果欲將非分區字段建立為唯一索引,例如:假設在TXN_CURRENT 表的某個字段建立唯一索引,oracle要求必須global prefixed index.

 否則報錯:

ORA-14039:partitioning columns must form a subset of key columns of a UNIQUE index

 

(3)流程圖再往下,此時要判斷“是否性能在可承受范圍,而分區的管理性、可用性更重 要?”。如果是,就應建立local non-profixed index。也就是上面所描述的:如果歷史數據的整理非常頻繁,而且不能承受全局分區索引重建的長時間帶來的索引不可用,同時日常交易性能尚能接受,則建 議設計為本地非前綴分區索引。

(4)流程圖再往下,最後判斷系統是否為交易系統或者是數據倉庫系統。因為通常情況 下,數據倉庫會有頻繁的大批量數據導入(ETL)操作,以及歷史數據清理操作,此時分區索引可用性更重要,因此建議設計為Localnon- profixed index 。而在交易系統中,日常查詢性能要求更高,歷史數據清理操作頻度相對較低,因此建議設計為global profixed index。

 注:oracle沒有global non-profixed index概念。

 

四、   分區表設計建議  只是建議:更多看實際!!!

 

(1)       表的大小:當表的大小超過1.5G—2GB時,或對於OLTP系統,表的記錄超過1000萬條時,都應考慮對表進行分區。

(2)      數據訪問特征:基於表的大部分查詢應用,只訪問表中的少量數據。對於這樣的表進行分區,可充分利用分區技術排除無關數據查詢的特征。

(3)      數據維護:按時間段刪除成批的數據,例如按月刪除歷史數據。對於這樣的表需要考慮進行分區,以滿足維護的需求。

(4)      數據備份和恢復:按時間周期進行表空間的備份時,在分區與表空間之間建立起對應關系。

(5)      只讀數據:如果一個表中的大部分數據都是只讀數據,通過對表進行分區,可將只讀數據存儲在只讀表空間中,對於數據庫的備是非常有益的。

(6)      並行數據操作:對於經常執行並行操作(如parallelinsert、parallel update等)的表應考慮進行分區。

(7)      表的可用性:當對表中部分數據的可用性要求很高時,應考慮進行表分區。


Oracle索引技術之怎建立最佳索引

怎樣建立最佳索引?1、明確地創建索引create index index_name on table_name(field_name)tablespace tablespace_namepctfree 5initrans 2maxtrans 255storage(minextents 1maxextents 16382pctincrease 0); 2、創建基於函數的索引常用與UPPER、LOWER、TO_CHAR(date)等函數分類上,例:create index idx_func on emp(UPPER(ename)) tablespace tablespace_name; 3、創建位圖索引對基數較小,且基數相對穩定的列建立索引時,首先應該考慮位圖索引,例:create bitmap index idx_bitm on class (classno) tablespace tablespace_name; 4、明確地創建唯一索引可以用create unique index語句來創建唯一索引,例:create unique index dept_unique_idx on dept(dept_no) tablespace idx_1; 5、創建與約束相關的索引可以用using index字句,為與unique和primary key約束相關的索引,例:alter table table_nameadd constraint PK_primary_keyname primary key(field_name)using index tablespace tablespace_name; 如何創建局部區索引?1)基礎表必須是分區表2)分區數量與基礎表相同3)每個索引分區的子分區數量與相應的基礎表分區相同4)基礎表的自分區中的行的索引項,被存儲在該索引的相應的自分區中,例如create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID)Pctfree 5Tablespace TBS_AK01_IDXStorage(MaxExtents 32768PctIncrease 0FreeLists 1FreeList Groups 1)local/ 如何創建范圍分區的全局索引?基礎表可以是全局表和分區表create index idx_start_date on tg_cdr01(start_date)global partition by range(start_date)(partition p01_idx vlaues less than ('0106')partition p01_idx vlaues less than ('0111')...partition p01_idx vlaues less than ('0401'))/ 如何重建現存的索引?重建現存的索引的當前時刻不會影響查詢重建索引可以刪除額外的數據塊提高索引查詢效率alter index idx_name rebuild nologging;對於分區索引alter index idx_name rebuild partition partition_name nologging; 刪除索引的原因?1)不再需要的索引2)索引沒有針對其相關的表所發布的查詢提供所期望的性能改善3)應用沒有用該索引來查詢數據4)該索引無效,必須在重建之前刪除該索引5)該索引已經變的太碎了,必須在重......余下全文>>
 

oracle中為何重建分區索引(索引分區)? 重建分區索引與索引分區什不同?

1.上述的語句是對單個分區索引進行重建。
2.索引分區的意思是指建立一個分區索引,而不是一個普通索引。
3.重建分區索引,這個比如說碎片太多,想換個表空間都可以重建的。
4.執行完了,就表示執行成功了。索引的分區信息可以在 user_ind_partitions 查詢
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved