程式設計師必須知道的Oracle索引知識

2022-08-25 11:45:17 字數 3066 閱讀 2543

simon 發表於  2012 -11 - 7   標籤   oracle , 資料庫優化 , 程式設計師 , 索引  閱讀 878 次       

關聯式資料庫的精髓就是通過關係表進行規範化的資料儲存,通過各種表連線技術和各種型別的索引技術來進行資訊的檢索和處理。合理的索引是保證各種操作快速、高效的關鍵。據統計,與資料庫有關的效能問題,70%是因為程式設計師對索引和表連線的不了解,導致sql語句共享性不高、全表掃瞄、索引被抑制而造成的。常用的索引型別有 b-樹索引、位圖索引、hash索引、索引編排表、反轉鍵索引、基於函式的索引、分割槽索引、本地和全域性索引。

1) 針對b*樹單字段索引的設計原則         1、分析sql語句中的約束條件字段         2、如果約束條件欄位不固定,建議建立針對單字段的普通 b*樹索引         3、選擇可選性最高的字段建立索引         4、如果是多表鏈結sql語句,注意被驅動表的連線字段是否需要建立索引         5、通過分析工具,分析執行計畫檢視設設計是否合理      2) 針對復合索引          使用復合索引必須明白復合索引的字首性(在oracle9i之前,只有在使用到索引的前導索引時才可以使用組合索引!)和可選性(使用user_indexes檢視,該檢視中顯示了乙個distinct_keys列。比較一下唯一鍵的數量和表中的行數,就可以判斷索引的選擇性。選擇性越高,索引返回的資料就越少)         1、分析sql語句中的約束條件字段         2、如果約束字段比較固定,則優先考慮建立針對多字段的普通b*樹復合索引         3、如果單個欄位是主鍵或唯一字段,或可選擇性非常高的字段,儘管約束條件比較固定,也不一定要建成復合索引,可建成單字段索引,降低索引開銷         4、優先考慮復合索引的字首性,再考慮可選性。按可選性由高到底復合。         5、如果條件涉及的字段不固定,組合比較靈活,則分別建立多個單字段上的索引         6、如果是多表連線sql語句,看是否可以在被驅動表的連線欄位與該錶的其他約束條件欄位上建立復合索引         7、通過分析工具,分析執行計畫檢視設設計是否合理

1、不要對字段加函式,包括自定義函式,加函式了索引會被抑制,可以用函式索引,但是應盡量避免使用,函式索引維護成本比普通索引大。     2、不要將字段嵌入表示式中例如 where a.s + 7 < 24,這樣即表a的s欄位有索引也不會被使用     3、連線字段型別要一致,連線字段如果乙個為字元乙個為long,索引也不會被使用     4、使用不等於操作符(<>、!=)、使用is null 或 is not null等也會造成索引被抑制

1、如何檢視索引的詳細資訊

1select*fromall_ind_columnswhereindex_name ='indexname';

2、查詢等待事件,如果在主要等待事件中,db file sequential read 比較高,說明在整個資料庫系統中,索引的讀寫操作比較多       ,已經成為主要瓶頸。     3、(9i後)在某個業務開始之前,執行如下命令

1alterindex《索引名》 monitoring usage;

在業務結束之後執行如下命令,結束監控

1alterindex《索引名》 nomonitoring usage;

然後查詢如下檢視,就能知道索引到底有沒有被利用

1select*fromv$object_usage;

4、頻繁的對索引字段進行update , delete操作,會對索引造成大量碎片,影響索引效率,並造成索引i/o的增加         a、執行如下語句可檢測索引碎片的情況

1select*fromuser_objectswhereobject_type='index';

1analyzeindex《索引名》 validate structure online;

1selectname,del_lf_rows_len,lf_rows_len,(del_lf_rows_len/lf_rows_len)*100fromindex_stats;

表中:索引碎片率(%)=(del_lf_rows_len/lf_rows_len)*100 如果索引碎片率超過20%,則oracle認為索引碎片已經非常嚴重,建議dba編寫乙個檢測所有索引碎片率的指令碼,定期執行,保持對索引碎片率的監測,建議超過15%就進行索引碎片的整理。     b、索引碎片整理       重建(鎖表):alter index 《索引名》 rebuild;          壓縮索引(不鎖表):alter index 《索引名》 coalesce;          建議定期對那些刪除操作頻繁的表重建索引。

1、當批量匯入大量資料時,索引會影響匯入速度,可以先drop索引,匯入後再重建索引。      2、不要亂建索引索引的目的是為了提高查詢速度,但它會加重dml的負擔。索引和表應該放在不同的表空間,如果把索引和表放在同乙個空間,會引起競爭,因為在讀取乙個表時,記錄和索引是同時讀取,修改也同步進行的。      3、索引空間是extent是大小應該是5 blocks的倍數,因為oracle是一次讀出5個blocks,如果你的extends是6,就會造成2次i/o操作。      4、在對大資料量的表進行建立索引時可以關閉索引對應的redo日誌,提高速度,因為索引和資料不同,如果索引建立時出意外,資料還在,就再建立一次好了。     5、initrans 引數比對應的表的值大些,因為索引也是已表記錄的方式儲存的,但索引大大小於表的記錄,所以乙個block中儲存的索引記錄就大大多於表在乙個block中的記錄,加大initrans可以增加在乙個block中的事務的併發數,就提高了效率。

程式設計師必須知道的延遲時間

l1快取 0.5ns 轉移 分支 5ns l2快取 7ns 14倍l1快取 加鎖 解鎖 25ns 訪問記憶體 100ns 20倍l2快取,200倍l1快取 1k位元組壓縮 zippy 3ns 前兆網絡卡上傳送1k位元組 10us ssd隨機讀4k資料 150us 從記憶體順序讀1mb資料 250us...

優秀程式設計師必須知道的32個演算法

1 a 搜尋演算法 圖形搜尋演算法,從給定起點到給定終點計算出路徑。其中使用了一種啟發式的估算,為每個節點估算通過該節點的最佳路徑,並以之為各個地點排定次序。演算法以得到的次序訪問這些節點。因此,a 搜尋演算法是最佳優先搜尋的範例。2 集束搜尋 又名定向搜尋,beam search 最佳優先搜尋演算...

優秀程式設計師必須知道的32種演算法

奧地利符號計算研究所 research institute for symbolic computation,簡稱risc 的christoph koutschan博士在自己的頁面上發布了一篇文章,提到他做了乙個調查,參與者大多數是計算機科學家,他請這些科學家投票選出最重要的演算法,以下是這次調查的...