IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)Oracle → oracle索引整理

oracle索引整理

時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

  一

  oracle的索引陷阱

  一個(gè)表中有幾百萬條數(shù)據(jù),對(duì)某個(gè)字段加了索引,但是查詢時(shí)性能并沒有什么提高,這主要可能是oracle的索引限制造成的。

  oracle的索引有一些索引限制,在這些索引限制發(fā)生的情況下,即使已經(jīng)加了索引,oracle還是會(huì)執(zhí)行一次全表掃描,查詢的性能不會(huì)比不加索引有所提高,反而可能由于數(shù)據(jù)庫(kù)維護(hù)索引的系統(tǒng)開銷造成性能更差。

  下面是一些常見的索引限制問題。

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

  下面這種情況,即使在列dept_id有一個(gè)索引,查詢語(yǔ)句仍然執(zhí)行一次全表掃描

  select * from dept where staff_num <> 1000;

  但是開發(fā)中的確需要這樣的查詢,難道沒有解決問題的辦法了嗎?

  有!

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

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

  2、使用 is null 或 is not null

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

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

  3、使用函數(shù)

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

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

  但是把函數(shù)應(yīng)用在條件上,索引是可以生效的,把上面的語(yǔ)句改成下面的語(yǔ)句,就可以通過索引進(jìn)行查找。

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

  4、比較不匹配的數(shù)據(jù)類型

  比較不匹配的數(shù)據(jù)類型也是難于發(fā)現(xiàn)的性能問題之一。

  下面的例子中,dept_id是一個(gè)varchar2型的字段,在這個(gè)字段上有索引,但是下面的語(yǔ)句會(huì)執(zhí)行全表掃描。

  select * from dept where dept_id = 900198;

  這是因?yàn)閛racle會(huì)自動(dòng)把where子句轉(zhuǎn)換成to_number(dept_id)=900198,就是3所說的情況,這樣就限制了索引的使用。

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

  select * from dept where dept_id = '900198';

  二

  各種索引使用場(chǎng)合及建議

  (1)B*Tree索引。

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

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

 ?。?)反向索引。

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

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

 ?。?)降序索引。

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

  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...])

  在實(shí)際應(yīng)用中,如果某個(gè)字段的值需要頻繁更新,那么就不適合在它上面創(chuàng)建位圖索引。

  在位圖索引中,如果你更新或插入其中一條數(shù)值為N的記錄,

  那么相應(yīng)表中數(shù)值為N的記錄(可能成百上千條)全部被Oracle鎖定,

  這就意味著其它用戶不能同時(shí)更新這些數(shù)值為N的記錄,其它用戶必須要等第一個(gè)用戶提交后,

  才能獲得鎖,更新或插入數(shù)據(jù),bitmap index它主要用于決策支持系統(tǒng)或靜態(tài)數(shù)據(jù)。

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

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

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

  索引創(chuàng)建策略

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

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

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

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

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

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

  唯一索引和不唯一索引都只是針對(duì)B樹索引而言.

  Oracle最多允許包含32個(gè)字段的復(fù)合索引

  由此估計(jì)出一個(gè)查詢?nèi)绻褂媚硞€(gè)索引會(huì)需要讀入的數(shù)據(jù)塊塊數(shù)。

  需要讀入的數(shù)據(jù)塊越多,則 cost 越大,Oracle 也就越有可能不選擇使用 index

  三

  能用唯一索引,一定用唯一索引

  能加非空,就加非空約束

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

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

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

關(guān)鍵詞標(biāo)簽:oracle索引整理

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 Oracle中使用alter table來增加,刪除,修改列的語(yǔ)法 Oracle中使用alter table來增加,刪除,修改列的語(yǔ)法 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 Oracle中使用alter table來增加,刪除,修改列的語(yǔ)法 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句 ORACLE和SQL語(yǔ)法區(qū)別歸納(1) oracle grant 授權(quán)語(yǔ)句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法