日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Oracle】Oracle索引

發(fā)布時(shí)間:2024/4/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Oracle】Oracle索引 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在關(guān)系數(shù)據(jù)庫中,索引是一種與表有關(guān)的數(shù)據(jù)庫結(jié)構(gòu),它可以使對(duì)應(yīng)于表的SQL語句執(zhí)行得更快。索引的作用相當(dāng)于圖書的目錄,可以根據(jù)目錄中的頁碼快速找到所需的內(nèi)容。?

對(duì)于數(shù)據(jù)庫來說,索引是一個(gè)必選項(xiàng),但對(duì)于現(xiàn)在的各種大型數(shù)據(jù)庫來說,索引可以大大提高數(shù)據(jù)庫的性能,以至于它變成了數(shù)據(jù)庫不可缺少的一部分。

在許多情況下,我們看到一些語句后面有 ? using index ; ,這個(gè)語句的功能能夠自動(dòng)創(chuàng)建一個(gè)索引。

?

索引分類:

邏輯分類

single?column?or?concatenated??  ?對(duì)一列或多列建所引

unique?or?nonunique   ?唯一的和非唯一的所引,也就是對(duì)某一列或幾列的鍵值(key)是否是唯一的。

Function-based??  基于某些函數(shù)索引,當(dāng)執(zhí)行某些函數(shù)時(shí)需要對(duì)其進(jìn)行計(jì)算,可以將某些函數(shù)的計(jì)算結(jié)果事先保存并加以索引,提高效率。?

Doman??  索引數(shù)據(jù)庫以外的數(shù)據(jù),使用相對(duì)較少

?

物理分類

B-Tree?normal?or?reverse?key???B-Tree索引也是我們傳統(tǒng)上常見所理解的索引,它又可以分為正常所引和倒序索引。

Bitmap??:?位圖所引,后面會(huì)細(xì)講

?

??

B-Tree 索引 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?

  B-Tree?index?也是我們傳統(tǒng)上常見所理解的索引。B-tree?balance?tree)即平衡樹,左右兩個(gè)分支相對(duì)平衡。

B-Tree?index

Root為根節(jié)點(diǎn),branch?為分支節(jié)點(diǎn),leaf?到最下面一層稱為葉子節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)表示一層,當(dāng)查找某一數(shù)據(jù)時(shí)先讀根節(jié)點(diǎn),再讀支節(jié)點(diǎn),最后找到葉子節(jié)點(diǎn)。葉子節(jié)點(diǎn)會(huì)存放index?entry?(索引入口),每個(gè)索引入口對(duì)應(yīng)一條記錄。

Index?entry?的組成部分:

Indexentry?entry??header??  存放一些控制信息。

Key?column?length???  某一key的長(zhǎng)度

Key?column?value???  ?某一個(gè)key?的值

ROWID??  指針,具體指向于某一個(gè)數(shù)據(jù)

?

創(chuàng)建索引:

用戶登錄: SQL> conn as1/as1 Connected.創(chuàng)建表: SQL> create table dex (id int,sex char(1),name char(10)); Table created. 向表中插入1000條數(shù)據(jù) SQL> begin 2 for i in 1..1000 3 loop 4 insert into dex values(i,'M','chongshi'); 5 end loop; 6 commit; 7 end; 8 / PL/SQL procedure successfully completed. 查看表記錄 SQL> select * from dex; ID SE NAME ---------- -- --------------------
... . .....
991 M chongshi 992 M chongshi 993 M chongshi 994 M chongshi 995 M chongshi 996 M chongshi 997 M chongshi 998 M chongshi 999 M chongshi 1000 M chongshi 1000 rows selected. 創(chuàng)建索引: SQL> create index dex_idx1 on dex(id); Index created. 注:對(duì)表的第一列(id)創(chuàng)建索引。 查看創(chuàng)建的表與索引 SQL> select object_name,object_type from user_objects; OBJECT_NAME OBJECT_TYPE -------------------------------------------------------------------------------- DEX TABLE DEX_IDX1 INDEX

  索引分離于表,作為一個(gè)單獨(dú)的個(gè)體存在,除了可以根據(jù)單個(gè)字段創(chuàng)建索引,也可以根據(jù)多列創(chuàng)建索引。Oracle要求創(chuàng)建索引最多不可超過32列。

SQL> create index dex_index2 on dex(sex,name); Index created. SQL> select object_name,object_type from user_objects; OBJECT_NAME OBJECT_TYPE -------------------------------------------------------------------------------- DEX TABLE DEX_IDX1 INDEX DEX_INDEX2 INDEX

?

這里需要理解:

  編寫一本書,只有章節(jié)頁面定好之后再設(shè)置目錄;數(shù)據(jù)庫索引也是一樣,只有先插入好數(shù)據(jù),再建立索引。那么我們后續(xù)對(duì)數(shù)據(jù)庫的內(nèi)容進(jìn)行插入、刪除,索引也需要隨之變化。但索引的修改是由oracle自動(dòng)完成的。

上面這張圖能更加清晰的描述索引的結(jié)構(gòu)。

跟節(jié)點(diǎn)記錄050條數(shù)據(jù)的位置,分支節(jié)點(diǎn)進(jìn)行拆分記錄010.......4250,葉子節(jié)點(diǎn)記錄每第數(shù)據(jù)的長(zhǎng)度和值,并由指針指向具體的數(shù)據(jù)。

最后一層的葉子節(jié)是雙向鏈接,它們是被有序的鏈接起來,這樣才能快速鎖定一個(gè)數(shù)據(jù)范圍。

如:

SQL> select * from dex where id>23 and id<32; ID SE NAME ---------- -- -------------------- 24 M chongshi 25 M chongshi 26 M chongshi 27 M chongshi 28 M chongshi 29 M chongshi 30 M chongshi 31 M chongshi 8 rows selected.

  如上面查找的列子,通過索引的方式先找到第23條數(shù)據(jù),再找到第32條數(shù)據(jù),這樣就能快速的鎖定一個(gè)查找的范圍,如果每條數(shù)據(jù)都要從根節(jié)點(diǎn)開始查找的話,那么效率就會(huì)非常低下。

?

?

位圖索引 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

  位圖索引主要針對(duì)大量相同值的列而創(chuàng)建。拿全國居民登錄一第表來說,假設(shè)有四個(gè)字段:姓名、性別、年齡、和身份證號(hào),年齡和性別兩個(gè)字段會(huì)產(chǎn)生許多相同的值,性別只有男女兩種值,年齡,1120(假設(shè)最大年齡120歲)個(gè)值。那么不管一張表有幾億條記錄,但根據(jù)性別字段來區(qū)分的話,只有兩種取值(男、女)。那么位圖索引就是根據(jù)字段的這個(gè)特性所建立的一種索引。

Bitmap?Index

  從上圖,我們可以看出,一個(gè)葉子節(jié)點(diǎn)(用不同顏色標(biāo)識(shí))代表一個(gè)key?,?start?rowid?和?end?rowid規(guī)定這種類型的檢索范圍,一個(gè)葉子節(jié)點(diǎn)標(biāo)記一個(gè)唯一的bitmap值。因?yàn)橐粋€(gè)數(shù)值類型對(duì)應(yīng)一個(gè)節(jié)點(diǎn),當(dāng)時(shí)行查詢時(shí),位圖索引通過不同位圖取值直接的位運(yùn)算(與或),來獲取到結(jié)果集合向量(計(jì)算出的結(jié)果)。

?

舉例講解:

假設(shè)存在數(shù)據(jù)表T,有兩個(gè)數(shù)據(jù)列A和B,取值如下,我們看到A和B列中存在相同的數(shù)據(jù)。

對(duì)兩個(gè)數(shù)據(jù)列A、B分別建立位圖索引:idx_t_bita和idx_t_bitb。兩個(gè)索引對(duì)應(yīng)的存儲(chǔ)邏輯結(jié)構(gòu)如下:

Idx_t_bita索引結(jié)構(gòu),對(duì)應(yīng)的是葉子節(jié)點(diǎn):

Idx_t_bitb索引結(jié)構(gòu),對(duì)應(yīng)的是葉子節(jié)點(diǎn):

?

對(duì)查詢“select?*?from?t?where?b=1?and?(a=’L’?or?a=’M’)”

分析:位圖索引使用方面,和B*索引有很大的不同。B*索引的使用,通常是從根節(jié)點(diǎn)開始,經(jīng)過不斷的分支節(jié)點(diǎn)比較到最近的符合條件葉子節(jié)點(diǎn)。通過葉子節(jié)點(diǎn)上的不斷Scan操作,“掃描”出結(jié)果集合rowid。

而位圖索引的工作方式截然不同。通過不同位圖取值直接的位運(yùn)算(與或),來獲取到結(jié)果集合向量(計(jì)算出的結(jié)果)。

針對(duì)實(shí)例SQL,可以拆分成如下的操作:

1、a=’L’?or?a=’M’

a=L:向量:1010

a=M:向量:0001

or操作的結(jié)果,就是兩個(gè)向量的或操作:結(jié)果為1011。

?

2、結(jié)合b=1的向量

中間結(jié)果向量:1011

B=1:向量:1001

and操作的結(jié)果,1001。翻譯過來就是第一和第四行是查詢結(jié)果。

?

3、獲取到結(jié)果rowid

目前知道了起始rowid和終止rowid,以及第一行和第四行為操作結(jié)果。可以通過試算的方法獲取到結(jié)果集合rowid。

?

位圖索引的特點(diǎn)

1.Bitmap索引的存儲(chǔ)空間節(jié)省?

2.Bitmap索引創(chuàng)建的速度快

3.Bitmap索引允許鍵值為空?

4.Bitmap索引對(duì)表記錄的高效訪問

?

創(chuàng)建位圖索引:

查看表記錄 SQL> select * from dex; ................... ID SEX NAME ---------- -- -------------------- 991 M chongshi 992 M chongshi 993 G chongshi 994 G chongshi 995 G chongshi 996 M chongshi 997 G chongshi 998 G chongshi 999 G chongshi 1000 M chongshi 1000 rows selected. 對(duì)于上面表來說sex(性別)只有兩種值,最適合用來創(chuàng)建位圖所引 創(chuàng)建索引: SQL> create bitmap index my_bit_idx on dex(sex); Index created. 查看創(chuàng)建的所引 SQL> select object_name,object_type from user_objects; OBJECT_NAME OBJECT_TYPE -------------------------------------------------------------------------------- MY_BIT_IDX INDEX

?

?

?

創(chuàng)建索引的一些規(guī)則 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?

1、權(quán)衡索引個(gè)數(shù)與DML之間關(guān)系,DML也就是插入、刪除數(shù)據(jù)操作。

這里需要權(quán)衡一個(gè)問題,建立索引的目的是為了提高查詢效率的,但建立的索引過多,會(huì)影響插入、刪除數(shù)據(jù)的速度,因?yàn)槲覀冃薷牡谋頂?shù)據(jù),索引也要跟著修改。這里需要權(quán)衡我們的操作是查詢多還是修改多。

2、把索引與對(duì)應(yīng)的表放在不同的表空間。

?????當(dāng)讀取一個(gè)表時(shí)表與索引是同時(shí)進(jìn)行的。如果表與索引和在一個(gè)表空間里就會(huì)產(chǎn)生資源競(jìng)爭(zhēng),放在兩個(gè)表這空就可并行執(zhí)行。

3、最好使用一樣大小是塊。

?????Oracle默認(rèn)五塊,讀一次I/O,如果你定義6個(gè)塊或10個(gè)塊都需要讀取兩次I/O。最好是5的整數(shù)倍更能提高效率。

4、如果一個(gè)表很大,建立索引的時(shí)間很長(zhǎng),因?yàn)榻⑺饕矔?huì)產(chǎn)生大量的redo信息,所以在創(chuàng)建索引時(shí)可以設(shè)置不產(chǎn)生或少產(chǎn)生redo信息。只要表數(shù)據(jù)存在,索引失敗了大不了再建,所以可以不需要產(chǎn)生redo信息。

?

5、建索引的時(shí)候應(yīng)該根據(jù)具體的業(yè)務(wù)SQL來創(chuàng)建,特別是where條件,還有where條件的順序,盡量將過濾大范圍的放在后面,因?yàn)镾QL執(zhí)行是從后往前的。(小李飛菜刀)

?

索引常見操作 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

改變索引

SQL> alter index employees_last _name_idx storage(next 400K maxextents 100);

索引創(chuàng)建后,感覺不合理,也可以對(duì)其參數(shù)進(jìn)行修改。詳情查看相關(guān)文檔

?

調(diào)整索引的空間:

新增加空間 SQL> alter index orders_region_id_idx allocate extent (size 200K datafile '/disk6/index01.dbf'); 釋放空間 SQL> alter index oraers_id_idx deallocate unused;

索引在使用的過程中可能會(huì)出現(xiàn)空間不足或空間浪費(fèi)的情況,這個(gè)時(shí)候需要新增或釋放空間。上面兩條命令完成新增與釋放操作。關(guān)于空間的新增oracle可以自動(dòng)幫助,如果了解數(shù)據(jù)庫的情況下手動(dòng)增加可以提高性能。

?

重新創(chuàng)建索引

所引是由oracle自動(dòng)完成,當(dāng)我們對(duì)數(shù)據(jù)庫頻繁的操作時(shí),索引也會(huì)跟著進(jìn)行修改,當(dāng)我們?cè)跀?shù)據(jù)庫中刪除一條記錄時(shí),對(duì)應(yīng)的索引中并沒有把相應(yīng)的索引只是做一個(gè)刪除標(biāo)記,但它依然占據(jù)著空間。除非一個(gè)塊中所有的標(biāo)記全被刪除的時(shí),整個(gè)塊的空間才會(huì)被釋放。這樣時(shí)間久了,索引的性能就會(huì)下降。這個(gè)時(shí)候可以重新建立一個(gè)干凈的索引來提高效率。

SQL> alter index orders_region_id_idx rebuild tablespace index02;

通過上面的命令就可以重現(xiàn)建立一個(gè)索引,oracle重建立索引的過程:

1、鎖表,鎖表之后其他人就不能對(duì)表做任何操作。

2、創(chuàng)建新的(干凈的)臨時(shí)索引。

3、把老的索引刪除掉

4、把新的索引重新命名為老索引的名字

5、對(duì)表進(jìn)行解鎖。

?

移動(dòng)所引

其實(shí),我們移動(dòng)索引到其它表空間也同樣使用上面的命令,在指定表空間時(shí)指定不同的表空間。新的索引創(chuàng)建在別位置,把老的干掉,就相當(dāng)于移動(dòng)了。

SQL> alter index orders_region_id_idx rebuild tablespace index03;

?

在線重新創(chuàng)建索引

上面介紹,在創(chuàng)建索引的時(shí)候,表是被鎖定,不能被使用。對(duì)于一個(gè)大表,重新創(chuàng)建索引所需要的時(shí)間較長(zhǎng),為了滿足用戶對(duì)表操作的需求,就產(chǎn)生的這種在線重新創(chuàng)建索引。

SQL> alter index orders_id_idx rebuild online;

創(chuàng)建過程:

1、鎖住表

2、創(chuàng)建立臨時(shí)的和空的索引和IOT表用來存在on-going?DML。普通表存放的鍵值,IOT所引表直接存放的表中數(shù)據(jù);on-gong?DML也就是用戶所做的一些增刪改的操作。

3、對(duì)表進(jìn)行解鎖

4、從老的索引創(chuàng)建一個(gè)新的索引。

5、IOT表里存放的是on-going?DML信息,IOT表的內(nèi)容與新創(chuàng)建的索引合并。

6、鎖住表

7、再次將IOT表的內(nèi)容更新到新索引中,把老的索引干掉。

8、把新的索引重新命名為老索引的名字

9、對(duì)表進(jìn)行解鎖

?

整合索引碎片

如上圖,在很多索引中有剩余的空間,可以通過一個(gè)命令把剩余空間整合到一起。  

SQL> alter index orders_id_idx coalesce;

?

刪除索引

SQL> drop index hr.departments_name_idx;

?

?

?

分析索引 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

  

  檢查所引的有效果,前面介紹,索引用的時(shí)間久了會(huì)產(chǎn)生大量的碎片、垃圾信息與浪費(fèi)的剩余空間了。可以通過重新創(chuàng)建索引來提高所引的性能。

可以通過一條命令來完成分析索引,分析的結(jié)果會(huì)存放在在index_stats表中。

查看存放分析數(shù)據(jù)的表: SQL> select count(*) from index_stats; COUNT(*) ---------- 0 執(zhí)行分析索引命令: SQL> analyze index my_bit_idx validate structure; Index analyzed. 再次查看 index_stats 已經(jīng)有了一條數(shù)據(jù) SQL> select count(*) from index_stats; COUNT(*) ---------- 1 把數(shù)據(jù)查詢出來: SQL> select height,name,lf_rows,lf_blks,del_lf_rows from index_stats; HEIGHT NAME LF_ROWS LF_BLKS DEL_LF_ROWS ---------- ---------------------------------------------------------------------- ---------- ----------- 2 MY_BIT_IDX 1000 3 100

分析數(shù)據(jù)分析

(HEIGHT)這個(gè)所引高度是2?,(NAME)索引名為MY_BIT_IDX??,(LF_ROWS)所引表有1000行數(shù)據(jù),(LF_BLKS)占用3個(gè)塊,(DEL_LF_ROWS)刪除100條記錄。

  這里也驗(yàn)證了前面所說的一個(gè)問題,刪除的100條數(shù)據(jù)只是標(biāo)記為刪除,因?yàn)榭偟臄?shù)據(jù)條數(shù)依然為1000條,占用3個(gè)塊,那么每個(gè)塊大于333條記錄,只有刪除的數(shù)據(jù)大于333條記錄,這時(shí)一個(gè)塊被清空,總的數(shù)據(jù)條數(shù)才會(huì)減少。

?

原文連接:Oracle索引

轉(zhuǎn)載于:https://www.cnblogs.com/HDK2016/p/6901787.html

超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的【Oracle】Oracle索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。