一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用Oracle索引時的注意事項大全

 程序積累 2014-08-20

本文主要介紹了一些使用Oracle索引時的注意事項,以及索引的使用規(guī)則和一些使用建議,希望能夠?qū)δ兴鶐椭?/p>

AD:

當(dāng)數(shù)據(jù)表的記錄較多時,Oracle數(shù)據(jù)庫使用索引來提高查詢的速度。關(guān)于索引的使用可以參考一下這篇文章:為Oracle數(shù)據(jù)表建立索引的一個簡單例子,本文我們主要介紹一些使用索引時應(yīng)該注意的事項,接下來就讓我們一起來了解一下吧。

一、Oracle的索引陷阱

一個表中有幾百萬條數(shù)據(jù),對某個字段加了索引,但是查詢時性能并沒有什么提高,這主要可能是oracle的索引限制造成的。Oracle的索引有一些索引限制,在這些索引限制發(fā)生的情況下,即使已經(jīng)加了索引,oracle還是會執(zhí)行一次全表掃描,查詢的性能不會比不加索引有所提高,反而可能由于數(shù)據(jù)庫維護(hù)索引的系統(tǒng)開銷造成性能更差。  

1、使用不等于操作符(<>, !=)

下面這種情況,即使在列dept_id有一個索引,查詢語句仍然執(zhí)行一次全表掃描:select * from dept where staff_num <> 1000; 有!

通過把用 or 語法替代不等號進(jìn)行查詢,就可以使用索引,以避免全表掃描:上面的語句改成下面這樣的,就可以使用索引了。

select * from dept shere staff_num < 1000 or dept_id > 1000;

2、使用 is null 或 is not null

使用 is null 或is nuo null也會限制索引的使用,因為數(shù)據(jù)庫并沒有定義null值。如果被索引的列中有很多null,就不會使用這個索引(除非索引是一個位圖索引,關(guān)于位圖索引,會在以后的blog文章里做詳細(xì)解釋)。在sql語句中使用null會造成很多麻煩。

解決這個問題的辦法就是:建表時把需要索引的列定義為非空(not null) 。

3、使用函數(shù)

如果沒有使用基于函數(shù)的索引,那么where子句中對存在索引的列使用函數(shù)時,會使優(yōu)化器忽略掉這些索引。下面的查詢就不會使用索引:

select * from staff where trunc(birthdate) = '01-MAY-82'; select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999);

4、比較不匹配的數(shù)據(jù)類型下面的例子中,dept_id是一個varchar2型的字段,在這個字段上有索引,但是下面的語句會執(zhí)行全表掃描。

select * from dept where dept_id = 900198;

這是因為oracle會自動把where子句轉(zhuǎn)換成to_number(dept_id)=900198,就是3所說的情況,這樣就限制了索引的使用。

把SQL語句改為如下形式就可以使用索引

select * from dept where dept_id = '900198';

二、各種索引使用場合及建議

(1)B*Tree索引。

常規(guī)索引,多用于oltp系統(tǒng),快速定位行,應(yīng)建立于高cardinality列(即列的唯一值除以行數(shù)為一個很大的值,存在很少的相同值)。

Create index indexname on tablename(columnname[columnname...])

(2)反向索引。

B*Tree的衍生產(chǎn)物,應(yīng)用于特殊場合,在ops環(huán)境加序列增加的列上建立,不適合做區(qū)域掃描。

Create index indexname on tablename(columnname[columnname...]) reverse

(3)降序索引。

B*Tree的衍生產(chǎn)物,應(yīng)用于有降序排列的搜索語句中,索引中儲存了降序排列的索引碼,提供了快速的降序搜索。

Create index indexname on tablename(columnname DESC[columnname...])

(4)位圖索引。

位圖方式管理的索引,適用于OLAP(在線分析)和DSS(決策處理)系統(tǒng),應(yīng)建立于低cardinality列,適合集中讀取,不適合插入和修改,提供比B*Tree索引更節(jié)省的空間。Create BITMAP index indexname on tablename(columnname[columnname...])

在實際應(yīng)用中,如果某個字段的值需要頻繁更新,那么就不適合在它上面創(chuàng)建位圖索引。在位圖索引中,如果你更新或插入其中一條數(shù)值為N的記錄,那么相應(yīng)表中數(shù)值為N的記錄(可能成百上千條)全部被Oracle鎖定,這就意味著其它用戶不能同時更新這些數(shù)值為N的記錄,其它用戶必須要等第一個用戶提交后,才能獲得鎖,更新或插入數(shù)據(jù),bitmap index它主要用于決策支持系統(tǒng)或靜態(tài)數(shù)據(jù)。

(5)函數(shù)索引。

B*Tree的衍生產(chǎn)物,應(yīng)用于查詢語句條件列上包含函數(shù)的情況,

索引中儲存了經(jīng)過函數(shù)計算的索引碼值??梢栽诓恍薷膽?yīng)用程序的基礎(chǔ)上能提高查詢效率。

索引創(chuàng)建策略

1.導(dǎo)入數(shù)據(jù)后再創(chuàng)建索引。

2.不需要為很小的表創(chuàng)建索引。

3.對于取值范圍很小的字段(比如性別字段)應(yīng)當(dāng)建立位圖索引。

4.限制表中的索引的數(shù)目。

5.為索引設(shè)置合適的PCTFREE值。

6.存儲索引的表空間最好單獨設(shè)定。

唯一索引和不唯一索引都只是針對B樹索引而言。

Oracle最多允許包含32個字段的復(fù)合索引需要讀入的數(shù)據(jù)塊越多,則 cost 越大,Oracle 也就越有可能不選擇使用index。

三、索引使用規(guī)則:

(1)能用唯一索引,一定用唯一索引

(2)能加非空,就加非空約束

(3)一定要統(tǒng)計表的信息,索引的信息,柱狀圖的信息。

(4)聯(lián)合索引的順序不同,影響索引的選擇,盡量將值少的放在前面

(5)只有做到以上四點,數(shù)據(jù)庫才會正確的選擇執(zhí)行計劃。

關(guān)于Oracle數(shù)據(jù)庫使用索引的注意事項就介紹到這里了,希望本次的介紹能夠帶給您一些收獲,謝謝!


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    高清不卡视频在线观看| 国产又黄又猛又粗又爽的片| 亚洲精品成人午夜久久| 国产免费黄片一区二区| 日韩人妻一区二区欧美| 亚洲中文字幕在线乱码av| 中国一区二区三区不卡| 婷婷色国产精品视频一区| 国产精品福利一级久久| 樱井知香黑人一区二区| 青青草草免费在线视频| 国产又色又爽又黄又大| 日韩人妻一区中文字幕| 国产亚洲欧美自拍中文自拍| 微拍一区二区三区福利| 亚洲欧美日韩网友自拍| 香港国产三级久久精品三级| 亚洲伦理中文字幕在线观看| 中文字字幕在线中文乱码二区| 午夜久久精品福利视频| 内用黄老外示儒术出处| 日本在线视频播放91| 午夜国产精品国自产拍av| 国产精品福利一级久久| 亚洲精品欧美精品一区三区| 日本熟女中文字幕一区| 在线日韩欧美国产自拍| 日本欧美三级中文字幕| 亚洲欧美日韩网友自拍| 精品视频一区二区三区不卡| 黄男女激情一区二区三区| 欧美综合色婷婷欧美激情| 日韩人妻毛片中文字幕| 国产男女激情在线视频| 在线免费不卡亚洲国产| 久久综合日韩精品免费观看| 一级片二级片欧美日韩| 九九热这里只有精品哦| 久七久精品视频黄色的| 一区二区日韩欧美精品| 亚洲中文字幕视频一区二区|