一周以來工作總結--關於位圖索引


      我曾經迷茫於一個問題,為什么有的時候明明有索引,卻無法提升效率。后來我在很多書上和論壇上看到,索引分為3種,默認的是B樹索引,這個類型的索引在對付重復很多很多的列的時候並沒有任何優勢,比如性別列這個只有兩個值(不排除會有第三值)的列。而這種重復度很高的列在我平時的生產系統中非常多,比如運營商的行政區列,西安市只有市區,戶縣,周至,藍田等幾個行政區,這種重復在百萬級甚至千萬級的表中屬高重復的。那么這種情況就要交給位圖索引來對付了。

      下面是我在自己機器上做的一個實驗:

      1 首先建立三張表,table1來自於dba_objects中object_type為table和index的,然后用如下的語句將這個表做大:

      

BEGIN
  FOR I IN 1 .. 10 LOOP
    INSERT INTO TABLE1
      SELECT * FROM TABLE1;
    COMMIT;
  END LOOP;
END;

      2 然后建立table2和table3,都來自於table1。
      3 table1不建立索引,table2建立B樹索引,table3建立位圖索引,建立到object_type列上:

CREATE INDEX idx_1 ON table2(object_type);


CREATE BITMAP INDEX idx_2 ON table3(object_type);

     之后用這個SQL語句查詢數據,看他們的執行計划:

    

select * from tablen where object_type = 'INDEX';

     本來打算用autotrace的,但是我的本機受不了那么大的SQL,會報ora-04030錯誤,所以這里用explain。
    

      可以明顯的看到,使用B樹索引的table2的執行計划中並沒有使用索引,而是和table1一樣,采取了全表掃描。而table3的執行計划可以卡到,cost只有11611,也就是上面兩個的一半不到吧,可見效果還是非常好的。隨着數據量的逐漸增大,索引的效果才會體現出來。

      據說位圖索引會比較小:

     

      事實還確實是這樣子。

      我覺得還有必要做一個實驗,就是測試在一個類似於序列號的列上采用位圖索引,B樹索引和不帶索引的查詢,對比一下這個時候的效率。但是我今天心情很糟糕,所以周末再說吧。

      歡迎廣大oracle從業者和愛好者加入我們的討論群:120244471


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM