麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

索引在Oracle中的應(yīng)用深入分析

2024-08-29 13:57:01
字體:
供稿:網(wǎng)友

索引是提高數(shù)據(jù)查詢最有效的方法,也是最難全面掌握的技術(shù),因為正確的索引可能使效率提高10000倍,而無效的索引可能是浪費了數(shù)據(jù)庫空間,甚至大大降低查詢性能。

一.索引的管理成本
1、 存儲索引的磁盤空間
2、 執(zhí)行數(shù)據(jù)修改操作(INSERT、UPDATE、DELETE)產(chǎn)生的索引維護
3、 在數(shù)據(jù)處理時所需額外的回退空間。

二.實際數(shù)據(jù)修改測試:
一個表有字段A、B、C,同時進行插入10000行記錄測試
在沒有建索引時平均完成時間是2.9秒
在對A字段建索引后平均完成時間是6.7秒
在對A字段和B字段建索引后平均完成時間是10.3秒
在對A字段、B字段和C字段都建索引后平均完成時間是11.7秒
從以上測試結(jié)果可以明顯看出索引對數(shù)據(jù)修改產(chǎn)生的影響

三.索引按存儲方法分類
1.B*樹索引
B*樹索引是最常用的索引,其存儲結(jié)構(gòu)類似書的索引結(jié)構(gòu),有分支和葉兩種類型的存儲數(shù)據(jù)塊,分支塊相當(dāng)于書的大目錄,葉塊相當(dāng)于索引到的具體的書頁。一般索引及唯一約束索引都使用B*樹索引。

2.位圖索引
位圖索引儲存主要用來節(jié)省空間,減少ORACLE對數(shù)據(jù)塊的訪問,它采用位圖偏移方式來與表的行ID號對應(yīng),采用位圖索引一般是重復(fù)值太多的表字段。位圖索引在實際密集型OLTP(數(shù)據(jù)事務(wù)處理)中用得比較少,因為OLTP會對表進行大量的刪除、修改、新建操作,ORACLE每次進行操作都會對要操作的數(shù)據(jù)塊加鎖,所以多人操作很容易產(chǎn)生數(shù)據(jù)塊鎖等待甚至死鎖現(xiàn)象。在OLAP(數(shù)據(jù)分析處理)中應(yīng)用位圖有優(yōu)勢,因為OLAP中大部分是對數(shù)據(jù)庫的查詢操作,而且一般采用數(shù)據(jù)倉庫技術(shù),所以大量數(shù)據(jù)采用位圖索引節(jié)省空間比較明顯。

四.索引按功能分類
1.唯一索引
唯一索引有兩個作用,一個是數(shù)據(jù)約束,一個是數(shù)據(jù)索引,其中數(shù)據(jù)約束主要用來保證數(shù)據(jù)的完整性,唯一索引產(chǎn)生的索引記錄中每一條記錄都對應(yīng)一個唯一的ROWID。

2.主關(guān)鍵字索引
主關(guān)鍵字索引產(chǎn)生的索引同唯一索引,只不過它是在數(shù)據(jù)庫建立主關(guān)鍵字時系統(tǒng)自動建立的。

3.一般索引
一般索引不產(chǎn)生數(shù)據(jù)約束作用,其功能主要是對字段建立索引表,以提高數(shù)據(jù)查詢速度。

五.索引按索引對象分類
1.單列索引(表單個字段的索引)
2.多列索引(表多個字段的索引)
3.函數(shù)索引(對字段進行函數(shù)運算的索引)

建立函數(shù)索引的方法:
create index 收費日期索引 on GC_DFSS(trunc(sk_rq))
create index 完全客戶編號索引 on yhzl(qc_bh||kh_bh)
在對函數(shù)進行了索引后,如果當(dāng)前會話要引用應(yīng)設(shè)置當(dāng)前會話的query_rewrite_enabled為TRUE。
alter session set query_rewrite_enabled=true

注:如果對用戶函數(shù)進行索引的話,那用戶函數(shù)應(yīng)加上 deterministic參數(shù),意思是函數(shù)在輸入值固定的情況下返回值也固定。例:
create or replace function trunc_add(input_date date)return date deterministic
as
begin
return trunc(input_date+1);
end trunc_add;

六.應(yīng)用索引的掃描分類
1.INDEX UNIQUE SCAN(按索引唯一值掃描)
select * from zl_yhjbqk where hbs_bh='5420016000'

2.INDEX RANGE SCAN(按索引值范圍掃描)
select * from zl_yhjbqk where hbs_bh>'5420016000'
select * from zl_yhjbqk where qc_bh>'7001'

3.INDEX FAST FULL SCAN(按索引值快速全部掃描)
select hbs_bh from zl_yhjbqk order by hbs_bh
select count(*) from zl_yhjbqk
select qc_bh from zl_yhjbqk group by qc_bh

七.什么情況下應(yīng)該建立索引
1.表的主關(guān)鍵字,自動建立唯一索引
如zl_yhjbqk(用戶基本情況)中的hbs_bh(戶標識編號)

2.表的字段唯一約束
ORACLE利用索引來保證數(shù)據(jù)的完整性
如lc_hj(流程環(huán)節(jié))中的lc_bh+hj_sx(流程編號+環(huán)節(jié)順序)

3.直接條件查詢的字段
在SQL中用于條件約束的字段
如zl_yhjbqk(用戶基本情況)中的qc_bh(區(qū)冊編號)
select * from zl_yhjbqk where qc_bh='7001'

4.查詢中與其它表關(guān)聯(lián)的字段,常常建立了外鍵關(guān)系
如zl_ydcf(用電成份)中的jldb_bh(計量點表編號)
select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh='540100214511'

5.查詢中排序的字段
排序的字段如果通過索引去訪問那將大大提高排序速度
select * from zl_yhjbqk order by qc_bh(建立qc_bh索引)
select * from zl_yhjbqk where qc_bh='7001' order by cb_sx(建立qc_bh+cb_sx索引,注:只是一個索引,其中包括qc_bh和cb_sx字段)

6.查詢中統(tǒng)計或分組統(tǒng)計的字段
select max(hbs_bh) from zl_yhjbqk
select qc_bh,count(*) from zl_yhjbqk group by qc_bh

八.什么情況下應(yīng)不建或少建索引
1.表記錄太少
如果一個表只有5條記錄,采用索引去訪問記錄的話,那首先需訪問索引表,再通過索引表訪問數(shù)據(jù)表,一般索引表與數(shù)據(jù)表不在同一個數(shù)據(jù)塊,這種情 況下ORACLE至少要往返讀取數(shù)據(jù)塊兩次。而不用索引的情況下ORACLE會將所有的數(shù)據(jù)一次讀出,處理速度顯然會比用索引快。

如表zl_sybm(使用部門)一般只有幾條記錄,除了主關(guān)鍵字外對任何一個字段建索引都不會產(chǎn)生性能優(yōu)化,實際上如果對這個表進行了統(tǒng)計分析后ORACLE也不會用你建的索引,而是自動執(zhí)行全表訪問。如:
select * from zl_sybm where sydw_bh='5401'(對sydw_bh建立索引不會產(chǎn)生性能優(yōu)化)

2.經(jīng)常插入、刪除、修改的表
對一些經(jīng)常處理的業(yè)務(wù)表應(yīng)在查詢允許的情況下盡量減少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等業(yè)務(wù)表。

3.數(shù)據(jù)重復(fù)且分布平均的表字段
假如一個表有10萬行記錄,有一個字段A只有T和F兩種值,且每個值的分布概率大約為50%,那么對這種表A字段建索引一般不會提高數(shù)據(jù)庫的查詢速度。

4.經(jīng)常和主字段一塊查詢但主字段索引值比較多的表字段
如gc_dfss(電費實收)表經(jīng)常按收費序號、戶標識編號、抄表日期、電費發(fā)生年月、操作標志來具體查詢某一筆收款的情況,如果將所有的字段 都建在一個索引里那將會增加數(shù)據(jù)的修改、插入、刪除時間,從實際上分析一筆收款如果按收費序號索引就已經(jīng)將記錄減少到只有幾條,如果再按后面的幾個字段索 引查詢將對性能不產(chǎn)生太大的影響。

九.如何只通過索引返回結(jié)果
一個索引一般包括單個或多個字段,如果能不訪問表直接應(yīng)用索引就返回結(jié)果那將大大提高數(shù)據(jù)庫查詢的性能。對比以下三個SQL,其中對表zl_yhjbqk的hbs_bh和qc_bh字段建立了索引:

1 select hbs_bh,qc_bh,xh_bz from zl_yhjbqk where qc_bh='7001'
執(zhí)行路徑:
SELECT STATEMENT, GOAL = CHOOSE 11 265 5565
TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 5565
INDEX RANGE SCAN DLYX 區(qū)冊索引 1 265
平均執(zhí)行時間(0.078秒)

2 select hbs_bh,qc_bh from zl_yhjbqk where qc_bh='7001'
執(zhí)行路徑:
SELECT STATEMENT, GOAL = CHOOSE 11 265 3710
TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 3710
INDEX RANGE SCAN DLYX 區(qū)冊索引 1 265
平均執(zhí)行時間(0.078秒)

3 select qc_bh from zl_yhjbqk where qc_bh='7001'
執(zhí)行路徑:
SELECT STATEMENT, GOAL = CHOOSE 1 265 1060
INDEX RANGE SCAN DLYX 區(qū)冊索引 1 265 1060
平均執(zhí)行時間(0.062秒)
從執(zhí)行結(jié)果可以看出第三條SQL的效率最高。執(zhí)行路徑可以看出第1、2條SQL都多執(zhí)行了TABLE ACCESS BY INDEX ROWID(通過ROWID訪問表) 這個步驟,因為返回的結(jié)果列中包括當(dāng)前使用索引(qc_bh)中未索引的列(hbs_bh,xh_bz),而第3條SQL直接通過QC_BH返回了結(jié)果, 這就是通過索引直接返回結(jié)果的方法。

十.如何快速新建大數(shù)據(jù)量表的索引
如果一個表的記錄達到100萬以上的話,要對其中一個字段建索引可能要花很長的時間,甚至導(dǎo)致服務(wù)器數(shù)據(jù)庫死機,因為在建索引的時候 ORACLE要將索引字段所有的內(nèi)容取出并進行全面排序,數(shù)據(jù)量大的話可能導(dǎo)致服務(wù)器排序內(nèi)存不足而引用磁盤交換空間進行,這將嚴重影響服務(wù)器數(shù)據(jù)庫的工 作。解決方法是增大數(shù)據(jù)庫啟動初始化中的排序內(nèi)存參數(shù),如果要進行大量的索引修改可以設(shè)置10M以上的排序內(nèi)存(ORACLE缺省大小為64K),在索引 建立完成后應(yīng)將參數(shù)修改回來,因為在實際OLTP數(shù)據(jù)庫應(yīng)用中一般不會用到這么大的排序內(nèi)存。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲性生活视频 | 国产草草视频 | 国产免费黄网 | 亚洲成人入口 | 制服丝袜成人动漫 | 一级黄色免费 | 国产精品亚洲一区二区三区在线观看 | 91网站链接| 99视频有精品视频高清 | asiass极品裸体女pics | 日本一区视频在线观看 | av成人一区二区 | 激情久久一区二区 | 在线男人天堂 | 久久久久久精 | 蜜桃视频观看麻豆 | 91久久国产综合精品女同国语 | 日韩视频―中文字幕 | 91福利在线观看 | 天天透天天狠天天爱综合97 | 日本娇小18xxxⅹhd | 久草免费资源视频 | 久久免费视频精品 | 中文字幕精品一二三四五六七八 | 成人精品久久 | 亚洲四播房 | 亚洲免费视频大全 | 黄色av网站免费 | 欧美日韩亚洲在线 | 日本a∨精品中文字幕在线 被啪羞羞视频在线观看 | 精品国产一区二区三区天美传媒 | 久久视频精品 | 一级做a爱片久久毛片a高清 | 在线成人av观看 | 蜜桃视频最新网址 | 亚洲午夜视频 | 视频一区 在线 | 国产噜噜噜噜噜久久久久久久久 | 久久精品亚洲一区二区三区观看模式 | 中文字幕在线观看精品 | 国产妞干网 |