oracle 對象管理 03_索引

一、索引的建立
CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>        --默認爲Btree索引
    ON <schema>.<table_name> 
        (<column_name> | <expression> ASC | DESC,         --expression基於函數的索引
         <column_name> | <expression> ASC | DESC,...)     --組合索引
    TABLESPACE <tablespace_name>                          --索引存儲的表空間
    STORAGE <storage_settings>                            --設置表空間存儲參數
    LOGGING | NOLOGGING                                   --指定是否產生重作日誌
    COMPUTE STATISTICS                                    --建立時收集統計信息
    NOCOMPRESS | COMPRESS<nn>                             --鍵壓縮,刪掉鍵中重複的值
    NOSORT | REVERSE                                      --索引順序與表相同,相反
    PARTITION | GLOBAL PARTITION<partition_setting>       --索引分區html

二、索引特性
索引的好處
    加快數據的檢索速度,加速表和表之間的鏈接,減小查詢中分組和排序的時間,提升系統的性能。
索引的不足
    建立索引和維護索引要耗費時間,須要佔物理空間,對錶中數據的DML操做,索引也須要動態維護,下降數據維護速度。
應該建索引的列
    常常須要搜索的列
    常常用在鏈接的列
    常常須要排序的列
    常用在WHERE 子句中的列
    組合索引列中把最頻繁訪問的列放最前    
當修改性能遠大於檢索性能時,不要建立索引
    e.組合索引時儘可能將過濾大範圍的放在後面,由於SQL執行是從後往前的,
限制索引,使一些索引沒法使用
    使用不等於操做符(<> 、 != ),經過把不等於操做符改爲 OR 條件,在RBO下會使用索引,CBO下仍不會使用索引。
    使用 IS NULL  或 IS NOT NULL ,要建索引的列儘可能不要有空值;
    使用函數,對索引列用函數會限制索引,能夠將函數用在列的取值上;
    比較不匹配的數據類型,比較時會將列轉成與值相同的數據類型再比較,能夠轉換值得數據類型;
索引的選擇性(USER_INDEXES.distinct_keys/count(*)),判斷索引返回數據的多少;
羣集因子(USER_INDEXES.Clustering_Factor,與leaf_blocks,num_rows)進行比較,判斷索引列的有序性
二元高度(Binary height),user_INDEXES.Blevel列,二元高度主要隨着表的大小以及被索引的列中值的範圍的狹窄程
   度而變化,對索引列的刪除修改會增長二元高度,重建索引可能會下降二元高度。
快速全局掃描,(Fast Full Scan) 容許 Oracle 執行一個全局索引掃描操做。快速全局掃描讀取 B- 樹索引上全部樹葉塊。
跳躍式掃描:容許優化器使用組合索引,即索引的前導列沒有出如今 WHERE 子句中。比全索引掃描要快的多。能夠對組合
            索引的部分列使用。express

三、索引管理
重建索引
    alter index index_name rebuild tablespace index02;
    alter index index_name  rebuild  online;
    對於分區索引,不能總體進行重建,只能對單個分區進行重建。語法以下:
    Alter index idx_name rebuild partition index_partition_name [online nologging]
    刪除索引,刪除的數據在索引裏只是標記爲刪除,只有刪除的數據大於塊裏存的總記錄,這時一個塊被清空,索引
    重建全局索引命令以下:
    Alter index idx_name rebuild [online nologging]
總的數據條數纔會減小。
    drop  index  index_name;
整理索引碎片
    alter index index_name  coalesce;
分析索引
    analyze index index_name validate structure;
    select height,name,lf_rows,lf_blks,del_lf_rows from index_stats;oracle

四、索引查詢視圖
    DBA_INDEXES
    USER_INDEXES
    USER_IND_COLUMNS 
    
五、ORACLE ROWID 
    ROWID 其實就是直接指向單獨行的線路圖,提供了訪問單行數據的能力。6/3/6/3:對象/文件/塊/行
    查詢表裏行的rowid,塊號
        select rowid,dbms_rowid.rowid_block_number(rowid), iid from tb;
    工具函數,查詢行所在的文件號,塊號,行號
        --工具函數
        create or replace function get_rowid
        (l_rowid in varchar2)
        return varchar2
        is
        ls_my_rowid  varchar2(200);          
        rowid_type  number;          
        object_number  number;          
        relative_fno  number;          
        block_number  number;          
        row_number  number;  
        begin
         dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number);          
         ls_my_rowid := 'Object# is      :'||to_char(object_number)||chr(10)||
          'Relative_fno is :'||to_char(relative_fno)||chr(10)||
          'Block number is :'||to_char(block_number)||chr(10)||
          'Row number is   :'||to_char(row_number);
         return ls_my_rowid ;
        end;   
        select get_rowid('AAASheAAEAAAAIOAAB') from dual;
        
六、索引的分類
B樹索引
    通用索引、默認的索引類型,最多能夠包括 32 列。索引列的值都存儲在索引中。當索引列的值知足
查詢時就不用從表中查詢;B 樹索引的索引值中包含 ROWID ,這樣 Oracle 就能夠在行級別上鎖定索引。
Oracle不會對索引列上包含 NULL 值的行進行索引。樹葉塊包含了索引值、ROWID,以及指向前一個和後
一個樹葉塊的指針。
    特色:
        適合與大量的增、刪、改(OLTP )
        不能用包含OR 操做符的查詢,CBO優化器OR操做不走索引
        適合高基數的列(惟一值多) 
位圖索引
    很是適合於決策支持系統(Decision Support System , DSS) 和數據倉庫,位圖索引存儲爲壓縮的索
引值,其中包含了必定範圍的 ROWID ,所以 Oracle 必須針對一個給定值鎖定全部範圍內的 ROWID 。這
種鎖定類型可能在某些 DML 語句中形成死鎖。列中包含了很是多的重複值,不多UPDATE操做,最多30列
    特色:
        適合與決策支持系統;
        作UPDATE 代價很是高;
        很是適合OR 操做符的查詢;
        基數比較少的時候才能建位圖索引; 
HASH索引 
    使用HASH索引必需要使用HASH集羣。
索引組織表
    把表的存儲結構改爲B樹結構,以表的主鍵進行排序。
反轉鍵索引 
    磁盤容量有限,同時還要執行大量的有序載入,就可使用反轉鍵索引
基於函數的索引 
    create index EMP$UPPER_JOB on   emp(UPPER(job)); 
分區索引 
    就是簡單地把一個索引分紅多個片段。能夠訪問更小的片段( 也更快 ) ,B樹和位圖索引均可以被
分區,而HASH索引不能夠被分區。表被分區而索引未被分區;表未被分區而索引被分區;表和索引都被
分區。分區可以提供更多能夠提升性能和可維護性的可能性,用分區後的表和索引時,Oracle還支持並
行查詢和並行DML。
本地分區索引
    使用與表相同的分區鍵和範圍界限來對本地索引分區。本地索引能夠是B樹或位圖索引,當表的分
區發生變化時,索引的維護由Oracle自動進行。局部索引只支持分區內的惟一性,沒法支持表上的惟一
性,所以若是要用局部索引去給表作惟一性約束,則約束中必需要包括分區鍵列。
    create index ix_custaddr_local_id on custaddr(id) local;
    有前綴索引:指包含了分區鍵,而且將其做爲引導列的索引。
    無前綴索引:索引的列不是以分區鍵開頭,或者不包含分區鍵列。
全局分區索引
    能夠選擇是否分區,並且索引的分區能夠不與表分區相對應。全局分區索引只能是B樹索引,到目
前爲止(10gR2),oracle只支持有前綴的全局索引。oracle不會自動的維護全局分區索引,當咱們在對
表的分區作修改時能夠加上update global indexes,或者執行完操做後 REBUILD。oracle只支持
range partitioned 和 Hash Partitioned.2中類型的全局分區索引
全局索引,全局索引對全部分區類型都支持:全局分區索引,只支持Range 分區和Hash 分區:
   表用a列做分區,索引用b作局部分區索引,若where條件中用b來查詢,那麼oracle會掃描全部的表和
索引的分區,成本會比分區更高,此時能夠考慮用b作全局分區索引。
            
參考資料:
http://www.2cto.com/database/201110/107271.html
http://www.cnblogs.com/flowerszhong/p/4535206.html函數

什麼是彙集索引,什麼是非彙集索引,什麼又是主鍵?
    彙集索引肯定表中數據的物理順序。彙集索引規定數據在表中的物理存儲順序,一個表只能包含一個彙集
索引,但該索引能夠包含多個列。彙集索引對於搜索範圍值的列特別有效。從表中檢索的數據進行排序時能夠
將該表在該列上建立彙集索引,提升性能。 
    非彙集索引是,索引與數據物理存儲分開,索引帶有指針指向數據的存儲位置。索引和表按本身的值排序
多用於包含大量非重複值的列,返回精確匹配的查詢。
    PRIMARY KEY 約束表中一個列或列的組合,其值能惟一地標識表中的每一行。經過它可強制表的實體完整性。
http://blog.sina.com.cn/s/blog_7e662b4a01012cx6.html    工具

相關文章
相關標籤/搜索