国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

Oracle數據庫索引時的注意事項

2024-07-09 22:43:41
字體:
來源:轉載
供稿:網友

一般只有在三種情況下Oracle數據庫才采用位圖索引:
第一種情況是是列的基數比較小,而有可能需要根據這些字段的內容查找相關的記錄;
第二種情況是是在條件語句中,用到了AND或者OR運算符的時候。除了這兩種情況外,最好能夠采用其他適合的索引。
第三種情況是,需要用到NULL作為查詢的限制條件。因為標準查詢一般情況下,會忽略所有的NULL值列。也就是說,若需要查詢“所有沒有身份證號碼”的員工的信息的時候,標準索引并不能夠起到加速查詢速度的作用。此時,就需要采用位圖索引。因為位圖索引會記錄相關的NULL值列信息。

一、Oracle的索引陷阱

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

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

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

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

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

  2、使用 is null 或 is not null

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

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

  3、使用函數

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

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

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

  select * from dept where dept_id = 900198;

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

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

  select * from dept where dept_id = '900198';

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

  (1)B*Tree索引。

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

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

  (2)反向索引。

  B*Tree的衍生產物,應用于特殊場合,在ops環境加序列增加的列上建立,不適合做區域掃描。

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

  (3)降序索引。

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

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

  (4)位圖索引。

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

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

  (5)函數索引。

  B*Tree的衍生產物,應用于查詢語句條件列上包含函數的情況,

  索引中儲存了經過函數計算的索引碼值。可以在不修改應用程序的基礎上能提高查詢效率。

  索引創建策略

  1.導入數據后再創建索引。

  2.不需要為很小的表創建索引。

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

  4.限制表中的索引的數目。

  5.為索引設置合適的PCTFREE值。

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

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

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

總之,在創建Oracle數據庫索引時,有一些問題使我們需要注意的,上文就為您介紹創建Oracle索引的一些注意事項,希望對您學習創建Oracle索引方面能有所幫助。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永安市| 南城县| 禄丰县| 黄平县| 沿河| 昌吉市| 安化县| 盘山县| 新邵县| 时尚| 通许县| 新田县| 永城市| 罗定市| 安塞县| 秦安县| 石河子市| 措美县| 柘荣县| 花莲市| 文昌市| 海林市| 哈巴河县| 宁晋县| 白玉县| 土默特右旗| 柘城县| 宁津县| 奉化市| 勃利县| 新河县| 都匀市| 南靖县| 隆昌县| 玛多县| 永州市| 古丈县| 芒康县| 金秀| 镇雄县| 霍林郭勒市|