• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • oracle 索引(2)

    發表于:2013-08-08來源:博客園作者:蟲師點擊數: 標簽:oracle
    ID SE NAME ---------- -- -------------------- 24 M chongshi 25 M chongshi 26 M chongshi 27 M chongshi 28 M chongshi 29 M chongshi 30 M chongshi 31 M chongshi 8 rows selected. 如上面查找的列子,

      ID SE NAME

      ---------- -- --------------------

      24 M chongshi

      25 M chongshi

      26 M chongshi

      27 M chongshi

      28 M chongshi

      29 M chongshi

      30 M chongshi

      31 M chongshi

      8 rows selected.

    復制代碼

      如上面查找的列子,通過索引的方式先找到第23條數據,再找到第32條數據,這樣就能快速的鎖定一個查找的范圍,如果每條數據都要從根節點開始查找的話,那么效率就會非常低下。

      位圖索引

      位圖索引主要針對大量相同值的列而創建。拿全國居民登錄一第表來說,假設有四個字段:姓名、性別、年齡、和身份證號,年齡和性別兩個字段會產生許多相同的值,性別只有男女兩種值,年齡,1到120(假設最大年齡120歲)個值。那么不管一張表有幾億條記錄,但根據性別字段來區分的話,只有兩種取值(男、女)。那么位圖索引就是根據字段的這個特性所建立的一種索引。

      Bitmap Index

      從上圖,我們可以看出,一個葉子節點(用不同顏色標識)代表一個key , start rowid 和 end rowid規定這種類型的檢索范圍,一個葉子節點標記一個唯一的bitmap值。因為一個數值類型對應一個節點,當時行查詢時,位圖索引通過不同位圖取值直接的位運算(與或),來獲取到結果集合向量(計算出的結果)。

      舉例講解:

      假設存在數據表T,有兩個數據列A和B,取值如下,我們看到A和B列中存在相同的數據。

      對兩個數據列A、B分別建立位圖索引:idx_t_bita和idx_t_bitb。兩個索引對應的存儲邏輯結構如下:

      Idx_t_bita索引結構,對應的是葉子節點:

      Idx_t_bitb索引結構,對應的是葉子節點:

      對查詢“select * from t where b=1 and (a=’L’ or a=’M’)”

      分析:位圖索引使用方面,和B*索引有很大的不同。B*索引的使用,通常是從根節點開始,經過不斷的分支節點比較到最近的符合條件葉子節點。通過葉子節點上的不斷Scan操作,“掃描”出結果集合rowid。

      而位圖索引的工作方式截然不同。通過不同位圖取值直接的位運算(與或),來獲取到結果集合向量(計算出的結果)。

      針對實例SQL,可以拆分成如下的操作:

      1、a=’L’ or a=’M’

      a=L:向量:1010

      a=M:向量:0001

      or操作的結果,就是兩個向量的或操作:結果為1011。

      2、結合b=1的向量

      中間結果向量:1011

      B=1:向量:1001

      and操作的結果,1001。翻譯過來就是第一和第四行是查詢結果。

      3、獲取到結果rowid

      目前知道了起始rowid和終止rowid,以及第一行和第四行為操作結果??梢酝ㄟ^試算的方法獲取到結果集合rowid。

      位圖索引的特點:

      1.Bitmap索引的存儲空間節省

      2.Bitmap索引創建的速度快

      3.Bitmap索引允許鍵值為空

      4.Bitmap索引對表記錄的高效訪問

      創建位圖索引:

    復制代碼

      查看表記錄

      SQL> select * from dex;

      ...................

      ID SEX NAME

      ---------- -- --------------------

      991 M chongshi

      992 M chongshi

      993 G chongshi

      994 G chongshi

      995 G chongshi

      996 M chongshi

      997 G chongshi

      998 G chongshi

      999 G chongshi

      1000 M chongshi

      1000 rows selected.

      對于上面表來說sex(性別)只有兩種值,最適合用來創建位圖所引

      創建索引:

      SQL> create bitmap index my_bit_idx on dex(sex);

      Index created.

      查看創建的所引

      SQL> select object_name,object_type from user_objects;

      OBJECT_NAME OBJECT_TYPE

      --------------------------------------------------------------------------------

      MY_BIT_IDX INDEX

    復制代碼

      創建索引的一些規則

      1、權衡索引個數與DML之間關系,DML也就是插入、刪除數據操作。

      這里需要權衡一個問題,建立索引的目的是為了提高查詢效率的,但建立的索引過多,會影響插入、刪除數據的速度,因為我們修改的表數據,索引也要跟著修改。這里需要權衡我們的操作是查詢多還是修改多。

      2、把索引與對應的表放在不同的表空間。

      當讀取一個表時表與索引是同時進行的。如果表與索引和在一個表空間里就會產生資源競爭,放在兩個表這空就可并行執行。

      3、最好使用一樣大小是塊。

      Oracle默認五塊,讀一次I/O,如果你定義6個塊或10個塊都需要讀取兩次I/O。最好是5的整數倍更能提高效率。

    原文轉自:http://www.cnblogs.com/fnng/archive/2012/10/10/2719221.html

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>