這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)oracle索引類型的作用是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
原陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
邏輯上: Single column 單行索引 Concatenated 多行索引 Unique NonUnique 非 Function-based函數(shù)索引 Domain 域索引 物理上: Partitioned 分區(qū)索引 NonPartitioned 非分區(qū)索引 B-tree: Normal 正常型B樹 Rever Key 反轉(zhuǎn)型B樹 Bitmap
Oracle提供了大量索引選項。知道在給定條件下使用哪個選項對于一個應(yīng)用程序的性能來說非常重要。一個錯誤的選擇可能會引發(fā)死鎖,并導(dǎo)致數(shù)據(jù)庫性能急劇下降或進程終止。而如果做出正確的選擇,則可以合理使用資源,使那些已經(jīng)運行了幾個小時甚至幾天的進程在幾分鐘得以完成,這樣會使您立刻成為一位英雄。下面就將簡單的討論每個索引選項。
下面討論的索引類型:
B樹索引(默認類型)
位圖索引
HASH索引
索引組織表索引
反轉(zhuǎn)鍵(reverse key)索引
基于函數(shù)的索引
分區(qū)索引(本地和全局索引)
位圖連接索引
2.1 B樹索引 (默認類型)
B樹索引在Oracle中是一個通用索引。在創(chuàng)建索引時它就是默認的索引類型。B樹索引可以是一個列的(簡單)索引,也可以是組合/復(fù)合(多個列)的索引。B樹索引最多可以包括32列。
在下圖的例子中,B樹索引位于雇員表的last_name列上。這個索引的二元高度為3;接下來,Oracle會穿過兩個樹枝塊(branch block),到達包含有ROWID的樹葉塊。在每個樹枝塊中,樹枝行包含鏈中下一個塊的ID號。
樹葉塊包含了索引值、ROWID,以及指向前一個和后一個樹葉塊的指針。Oracle可以從兩個方向遍歷這個二叉樹。B樹索引保存了在索引列上有值的每個數(shù)據(jù)行的ROWID值。Oracle不會對索引列上包含NULL值的行進行索引。如果索引是多個列的組合索引,而其中列上包含NULL值,這一行就會處于包含NULL值的索引列中,且將被處理為空(視為NULL)。
技巧:索引列的值都存儲在索引中。因此,可以建立一個組合(復(fù)合)索引,這些索引可以直接滿足查詢,而不用訪問表。這就不用從表中檢索數(shù)據(jù),從而減少了I/O量。
B-tree 特點:
適合與大量的增、刪、改(OLTP)
不能用包含OR操作符的查詢;
適合高基數(shù)的列(唯一值多)
典型的樹狀結(jié)構(gòu);
每個結(jié)點都是數(shù)據(jù)塊;
大多都是物理上一層、兩層或三層不定,邏輯上三層;
葉子塊數(shù)據(jù)是排序的,從左向右遞增;
在分支塊和根塊中放的是索引的范圍;
2.2 位圖索引
位圖索引非常適合于決策支持系統(tǒng)(Decision Support System,DSS)和數(shù)據(jù)倉庫,它們不應(yīng)該用于通過事務(wù)處理應(yīng)用程序訪問的表。它們可以使用較少到中等基數(shù)(不同值的數(shù)量)的列訪問非常大的表。盡管位圖索引最多可達30個列,但通常它們都只用于少量的列。
例如,您的表可能包含一個稱為Sex的列,它有兩個可能值:男和女。這個基數(shù)只為2,如果用戶頻繁地根據(jù)Sex列的值查詢該表,這就是位圖索引的基列。當一個表內(nèi)包含了多個位圖索引時,您可以體會到位圖索引的真正威力。如果有多個可用的位圖索引,Oracle就可以合并從每個位圖索引得到的結(jié)果集,快速刪除不必要的數(shù)據(jù)。
Bitmapt 特點:
適合與決策支持系統(tǒng);
做UPDATE代價非常高;
非常適合OR操作符的查詢;
基數(shù)比較少的時候才能建位圖索引;
技巧:對于有較低基數(shù)的列需要使用位圖索引。性別列就是這樣一個例子,它有兩個可能值:男或女(基數(shù)僅為2)。位圖對于低基數(shù)(少量的不同值)列來說非常快,這是因為索引的尺寸相對于B樹索引來說小了很多。因為這些索引是低基數(shù)的B樹索引,所以非常小,因此您可以經(jīng)常檢索表中超過半數(shù)的行,并且仍使用位圖索引。
當大多數(shù)條目不會向位圖添加新的值時,位圖索引在批處理(單用戶)操作中加載表(插入操作)方面通常要比B樹做得好。當多個會話同時向表中插入行時不應(yīng)該使用位圖索引,在大多數(shù)事務(wù)處理應(yīng)用程序中都會發(fā)生這種情況。
示例
下面來看一個示例表PARTICIPANT,該表包含了來自個人的調(diào)查數(shù)據(jù)。列Age_Code、Income_Level、Education_Level和Marital_Status都包括了各自的位圖索引。下圖顯示了每個直方圖中的數(shù)據(jù)平衡情況,以及對訪問每個位圖索引的查詢的執(zhí)行路徑。圖中的執(zhí)行路徑顯示了有多少個位圖索引被合并,可以看出性能得到了顯著的提高。
如上圖圖所示,優(yōu)化器依次使用4個單獨的位圖索引,這些索引的列在WHERE子句中被引用。每個位圖記錄指針(例如0或1),用于指示表中的哪些行包含位圖中的已知值。有了這些信息后,Oracle就執(zhí)行BITMAP AND操作以查找將從所有4個位圖中返回哪些行。該值然后被轉(zhuǎn)換為ROWID值,并且查詢繼續(xù)完成剩余的處理工作。注意,所有4個列都有非常低的基數(shù),使用索引可以非??焖俚胤祷仄ヅ涞男?。
技巧:在一個查詢中合并多個位圖索引后,可以使性能顯著提高。位圖索引使用固定長度的數(shù)據(jù)類型要比可變長度的數(shù)據(jù)類型好。較大尺寸的塊也會提高對位圖索引的存儲和讀取性能。
下面的查詢可顯示索引類型。
SQL> select index_name, index_type from user_indexes;
INDEX_NAME INDEX_TYPE
------------------------------ ----------------------
TT_INDEX NORMAL
IX_CUSTADDR_TP NORMAL
B樹索引作為NORMAL列出;而位圖索引的類型值為BITMAP。
技巧:如果要查詢位圖索引列表,可以在USER _INDEXES視圖中查詢index_type列。
建議不要在一些聯(lián)機事務(wù)處理(OLTP)應(yīng)用程序中使用位圖索引。B樹索引的索引值中包含ROWID,這樣Oracle就可以在行級別上鎖定索引。位圖索引存儲為壓縮的索引值,其中包含了一定范圍的ROWID,因此Oracle必須針對一個給定值鎖定所有范圍內(nèi)的ROWID。這種鎖定類型可能在某些DML語句中造成死鎖。SELECT語句不會受到這種鎖定問題的影響。
位圖索引的使用限制:
基于規(guī)則的優(yōu)化器不會考慮位圖索引。
當執(zhí)行ALTER TABLE語句并修改包含有位圖索引的列時,會使位圖索引失效。
位圖索引不包含任何列數(shù)據(jù),并且不能用于任何類型的完整性檢查。
位圖索引不能被聲明為唯一索引。
位圖索引的最大長度為30。
技巧:不要在繁重的OLTP環(huán)境中使用位圖索引
2.3 HASH索引
使用HASH索引必須要使用HASH集群。建立一個集群或HASH集群的同時,也就定義了一個集群鍵。這個鍵告訴Oracle如何在集群上存儲表。在存儲數(shù)據(jù)時,所有與這個集群鍵相關(guān)的行都被存儲在一個數(shù)據(jù)庫塊上。如果數(shù)據(jù)都存儲在同一個數(shù)據(jù)庫塊上,并且將HASH索引作為WHERE子句中的確切匹配,Oracle就可以通過執(zhí)行一個HASH函數(shù)和I/O來訪問數(shù)據(jù)——而通過使用一個二元高度為4的B樹索引來訪問數(shù)據(jù),則需要在檢索數(shù)據(jù)時使用4個I/O。如下圖所示,其中的查詢是一個等價查詢,用于匹配HASH列和確切的值。Oracle可以快速使用該值,基于HASH函數(shù)確定行的物理存儲位置。
HASH索引可能是訪問數(shù)據(jù)庫中數(shù)據(jù)的最快方法,但它也有自身的缺點。集群鍵上不同值的數(shù)目必須在創(chuàng)建HASH集群之前就要知道。需要在創(chuàng)建HASH集群的時候指定這個值。低估了集群鍵的不同值的數(shù)字可能會造成集群的沖突(兩個集群的鍵值擁有相同的HASH值)。這種沖突是非常消耗資源的。沖突會造成用來存儲額外行的緩沖溢出,然后造成額外的I/O。如果不同HASH值的數(shù)目已經(jīng)被低估,您就必須在重建這個集群之后改變這個值。
ALTER CLUSTER命令不能改變HASH鍵的數(shù)目。HASH集群還可能浪費空間。如果無法確定需要多少空間來維護某個集群鍵上的所有行,就可能造成空間的浪費。如果不能為集群的未來增長分配好附加的空間,HASH集群可能就不是最好的選擇。如果應(yīng)用程序經(jīng)常在集群表上進行全表掃描,HASH集群可能也不是最好的選擇。由于需要為未來的增長分配好集群的剩余空間量,全表掃描可能非常消耗資源。
在實現(xiàn)HASH集群之前一定要小心。您需要全面地觀察應(yīng)用程序,保證在實現(xiàn)這個選項之前已經(jīng)了解關(guān)于表和數(shù)據(jù)的大量信息。通常,HASH對于一些包含有序值的靜態(tài)數(shù)據(jù)非常有效。
技巧:HASH索引在有限制條件(需要指定一個確定的值而不是一個值范圍)的情況下非常有用。
2.4 索引組織表
索引組織表會把表的存儲結(jié)構(gòu)改成B樹結(jié)構(gòu),以表的主鍵進行排序。這種特殊的表和其他類型的表一樣,可以在表上執(zhí)行所有的DML和DDL語句。由于表的特殊結(jié)構(gòu),ROWID并沒有被關(guān)聯(lián)到表的行上。
對于一些涉及精確匹配和范圍搜索的語句,索引組織表提供了一種基于鍵的快速數(shù)據(jù)訪問機制?;谥麈I值的UPDATE和DELETE語句的性能也同樣得以提高,這是因為行在物理上有序。由于鍵列的值在表和索引中都沒有重復(fù),存儲所需要的空間也隨之減少。
如果不會頻繁地根據(jù)主鍵列查詢數(shù)據(jù),則需要在索引組織表中的其他列上創(chuàng)建二級索引。不會頻繁根據(jù)主鍵查詢表的應(yīng)用程序不會了解到使用索引組織表的全部優(yōu)點。對于總是通過對主鍵的精確匹配或范圍掃描進行訪問的表,就需要考慮使用索引組織表。
技巧:可以在索引組織表上建立二級索引。
2.5 反轉(zhuǎn)鍵索引
當載入一些有序數(shù)據(jù)時,索引肯定會碰到與I/O相關(guān)的一些瓶頸。在數(shù)據(jù)載入期間,某部分索引和磁盤肯定會比其他部分使用頻繁得多。為了解決這個問題,可以把索引表空間存放在能夠把文件物理分割在多個磁盤上的磁盤體系結(jié)構(gòu)上。
為了解決這個問題,Oracle還提供了一種反轉(zhuǎn)鍵索引的方法。如果數(shù)據(jù)以反轉(zhuǎn)鍵索引存儲,這些數(shù)據(jù)的值就會與原先存儲的數(shù)值相反。這樣,數(shù)據(jù)1234、1235和1236就被存儲成4321、5321和6321。結(jié)果就是索引會為每次新插入的行更新不同的索引塊。
技巧:如果您的磁盤容量有限,同時還要執(zhí)行大量的有序載入,就可以使用反轉(zhuǎn)鍵索引。
不可以將反轉(zhuǎn)鍵索引與位圖索引或索引組織表結(jié)合使用。因為不能對位圖索引和索引組織表進行反轉(zhuǎn)鍵處理。
2.6 基于函數(shù)的索引
可以在表中創(chuàng)建基于函數(shù)的索引。如果沒有基于函數(shù)的索引,任何在列上執(zhí)行了函數(shù)的查詢都不能使用這個列的索引。例如,下面的查詢就不能使用JOB列上的索引,除非它是基于函數(shù)的索引:
select * from emp where UPPER(job) = 'MGR';
下面的查詢使用JOB列上的索引,但是它將不會返回JOB列具有Mgr或mgr值的行:
select * from emp where job = 'MGR';
可以創(chuàng)建這樣的索引,允許索引訪問支持基于函數(shù)的列或數(shù)據(jù)??梢詫α斜磉_式UPPER(job)創(chuàng)建索引,而不是直接在JOB列上建立索引,如:
create index EMP$UPPER_JOB on emp(UPPER(job));
盡管基于函數(shù)的索引非常有用,但在建立它們之前必須先考慮下面一些問題:
能限制在這個列上使用的函數(shù)嗎?如果能,能限制所有在這個列上執(zhí)行的所有函數(shù)嗎
是否有足夠應(yīng)付額外索引的存儲空間?
在每列上增加的索引數(shù)量會對針對該表執(zhí)行的DML語句的性能帶來何種影響?
基于函數(shù)的索引非常有用,但在實現(xiàn)時必須小心。在表上創(chuàng)建的索引越多,INSERT、UPDATE和DELETE語句的執(zhí)行就會花費越多的時間。
注意:對于優(yōu)化器所使用的基于函數(shù)的索引來說,必須把初始參數(shù)QUERY _REWRITE _ ENABLED設(shè)定為TRUE。
示例:
select count(*) from sample where ratio(balance,limit) >.5;
Elapsed time: 20.1 minutes
create index ratio_idx1 on sample (ratio(balance, limit));
select count(*) from sample where ratio(balance,limit) >.5;
Elapsed time: 7 seconds!!!
2.7 分區(qū)索引
分區(qū)索引就是簡單地把一個索引分成多個片斷。通過把一個索引分成多個片斷,可以訪問更小的片斷(也更快),并且可以把這些片斷分別存放在不同的磁盤驅(qū)動器上(避免I/O問題)。B樹和位圖索引都可以被分區(qū),而HASH索引不可以被分區(qū)。可以有好幾種分區(qū)方法:表被分區(qū)而索引未被分區(qū);表未被分區(qū)而索引被分區(qū);表和索引都被分區(qū)。不管采用哪種方法,都必須使用基于成本的優(yōu)化器。分區(qū)能夠提供更多可以提高性能和可維護性的可能性
有兩種類型的分區(qū)索引:本地分區(qū)索引和全局分區(qū)索引。每個類型都有兩個子類型,有前綴索引和無前綴索引。表各列上的索引可以有各種類型索引的組合。如果使用了位圖索引,就必須是本地索引。把索引分區(qū)最主要的原因是可以減少所需讀取的索引的大小,另外把分區(qū)放在不同的表空間中可以提高分區(qū)的可用性和可靠性。
在使用分區(qū)后的表和索引時,Oracle還支持并行查詢和并行DML。這樣就可以同時執(zhí)行多個進程,從而加快處理這條語句。
2.7.1.本地分區(qū)索引(通常使用的索引)
可以使用與表相同的分區(qū)鍵和范圍界限來對本地索引分區(qū)。每個本地索引的分區(qū)只包含了它所關(guān)聯(lián)的表分區(qū)的鍵和ROWID。本地索引可以是B樹或位圖索引。如果是B樹索引,它可以是唯一或不唯一的索引。
這種類型的索引支持分區(qū)獨立性,這就意味著對于單獨的分區(qū),可以進行增加、截取、刪除、分割、脫機等處理,而不用同時刪除或重建索引。Oracle自動維護這些本地索引。本地索引分區(qū)還可以被單獨重建,而其他分區(qū)不會受到影響。
2.7.1.1 有前綴的索引
有前綴的索引包含了來自分區(qū)鍵的鍵,并把它們作為索引的前導(dǎo)。例如,讓我們再次回顧participant表。在創(chuàng)建該表后,使用survey_id和survey_date這兩個列進行范圍分區(qū),然后在survey_id列上建立一個有前綴的本地索引,如下圖所示。這個索引的所有分區(qū)都被等價劃分,就是說索引的分區(qū)都使用表的相同范圍界限來創(chuàng)建。
技巧:本地的有前綴索引可以讓Oracle快速剔除一些不必要的分區(qū)。也就是說沒有包含WHERE條件子句中任何值的分區(qū)將不會被訪問,這樣也提高了語句的性能。
2.7.1.2 無前綴的索引
無前綴的索引并沒有把分區(qū)鍵的前導(dǎo)列作為索引的前導(dǎo)列。若使用有同樣分區(qū)鍵(survey_id和survey_date)的相同分區(qū)表,建立在survey_date列上的索引就是一個本地的無前綴索引,如下圖所示??梢栽诒淼娜我涣猩蟿?chuàng)建本地?zé)o前綴索引,但索引的每個分區(qū)只包含表的相應(yīng)分區(qū)的鍵值。
如果要把無前綴的索引設(shè)為唯一索引,這個索引就必須包含分區(qū)鍵的子集。在這個例子中,我們必須把包含survey和(或)survey_id的列進行組合(只要survey_id不是索引的第一列,它就是一個有前綴的索引)。
技巧:對于一個唯一的無前綴索引,它必須包含分區(qū)鍵的子集。
2.7.2. 全局分區(qū)索引
全局分區(qū)索引在一個索引分區(qū)中包含來自多個表分區(qū)的鍵。一個全局分區(qū)索引的分區(qū)鍵是分區(qū)表中不同的或指定一個范圍的值。在創(chuàng)建全局分區(qū)索引時,必須定義分區(qū)鍵的范圍和值。全局索引只能是B樹索引。Oracle在默認情況下不會維護全局分區(qū)索引。如果一個分區(qū)被截取、增加、分割、刪除等,就必須重建全局分區(qū)索引,除非在修改表時指定ALTER TABLE命令的UPDATE GLOBAL INDEXES子句。
2.7.2.1 有前綴的索引
通常,全局有前綴索引在底層表中沒有經(jīng)過對等分區(qū)。沒有什么因素能限制索引的對等分區(qū),但Oracle在生成查詢計劃或執(zhí)行分區(qū)維護操作時,并不會充分利用對等分區(qū)。如果索引被對等分區(qū),就必須把它創(chuàng)建為一個本地索引,這樣Oracle可以維護這個索引,并使用它來刪除不必要的分區(qū),如下圖所示。在該圖的3個索引分區(qū)中,每個分區(qū)都包含指向多個表分區(qū)中行的索引條目。
分區(qū)的、全局有前綴索引
技巧:如果一個全局索引將被對等分區(qū),就必須把它創(chuàng)建為一個本地索引,這樣Oracle可以維護這個索引,并使用它來刪除不必要的分區(qū)。
2.7.2.2 無前綴的索引
Oracle不支持無前綴的全局索引。
2.8 位圖連接索引
位圖連接索引是基于兩個表的連接的位圖索引,在數(shù)據(jù)倉庫環(huán)境中使用這種索引改進連接維度表和事實表的查詢的性能。創(chuàng)建位圖連接索引時,標準方法是連接索引中常用的維度表和事實表。當用戶在一次查詢中結(jié)合查詢事實表和維度表時,就不需要執(zhí)行連接,因為在位圖連接索引中已經(jīng)有可用的連接結(jié)果。通過壓縮位圖連接索引中的ROWID進一步改進性能,并且減少訪問數(shù)據(jù)所需的I/O數(shù)量。
創(chuàng)建位圖連接索引時,指定涉及的兩個表。相應(yīng)的語法應(yīng)該遵循如下模式:
create bitmap index FACT_DIM_COL_IDX on FACT(DIM.Descr_Col) from FACT, DIM
where FACT.JoinCol = DIM.JoinCol;
位圖連接的語法比較特別,其中包含F(xiàn)ROM子句和WHERE子句,并且引用兩個單獨的表。索引列通常是維度表中的描述列——就是說,如果維度是CUSTOMER,并且它的主鍵是CUSTOMER_ID,則通常索引Customer_Name這樣的列。如果事實表名為SALES,可以使用如下的命令創(chuàng)建索引:
create bitmap index SALES_CUST_NAME_IDX
on SALES(CUSTOMER.Customer_Name) from SALES, CUSTOMER
where SALES.Customer_ID=CUSTOMER.Customer_ID;
如果用戶接下來使用指定Customer_Name列值的WHERE子句查詢SALES和CUSTOMER表,優(yōu)化器就可以使用位圖連接索引快速返回匹配連接條件和Customer_Name條件的行。
位圖連接索引的使用一般會受到限制:
1)只可以索引維度表中的列。
2)用于連接的列必須是維度表中的主鍵或唯一約束;如果是復(fù)合主鍵,則必須使用連接中的每一列。
3)不可以對索引組織表創(chuàng)建位圖連接索引,并且適用于常規(guī)位圖索引的限制也適用于位圖連接索引。
上述就是小編為大家分享的oracle索引類型的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享題目:oracle索引類型的作用是什么
當前URL:http://www.rwnh.cn/article36/jishpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)頁設(shè)計公司、關(guān)鍵詞優(yōu)化、動態(tài)網(wǎng)站、定制網(wǎng)站、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)