使用點陣圖連線索引最佳化OLAP查詢

lhrbest發表於2017-05-12
點陣圖連線索引,就是將事實表和維度表的ROWID提前進行對映,省去了連線時的開銷。

下面將點陣圖連線索引和一般的點陣圖索引進行比較。

看以下SQL語句:

點選(此處)摺疊或開啟

  1. select s.prod_id,s.promo_id,s.channel_id
  2. from sales_A s, products_A pd, promotions_A pm, channels_A ch
    where s.prod_id = pd.prod_id
      and s.promo_id = pm.promo_id
      and s.channel_id = ch.channel_id
      and pd.prod_id = 27;
如果分別在sales_A表上為prod_id, promo_id, channel_id列建立點陣圖索引,其執行計劃為:

使用點陣圖連線索引最佳化OLAP查詢

然後建立點陣圖連線索引。
建立點陣圖索引,需要確保維度表的連結列上有唯一索引或主鍵,如果是複合主鍵,則需要將相關列都加入進來。
配置唯一性約束:

點選(此處)摺疊或開啟

  1. alter table products_A add constraint products_pk primary key(prod_id);
建立點陣圖連線索引:

點選(此處)摺疊或開啟

  1. create bitmap index sales_A_bjix
  2. on sales_A
    ( pr.prod_id, pm.promo_id, ch.channel_id )
    from sales_A a, products_A pr, promotions_A pm, channels_A ch
    where a.prod_id = pr.prod_id
      and a.promo_id = pm.promo_id
      and a.channel_id = ch.channel_id
    tablespace sh
    nologging;
檢視報告:

點選(此處)摺疊或開啟

  1. column index_name format a15
  2. column inner_table format a15
    column inner_col format a15
    column outer_table format a15
    column outer_col format a15
    select index_name, inner_table_name inner_table, inner_table_column inner_col,
      outer_table_name outer_table, outer_table_column outer_col
    from user_join_ind_columns
    where index_name = 'SALES_A_BJIX';


INDEX_NAME      INNER_TABLE     INNER_COL       OUTER_TABLE     OUTER_COL
--------------- --------------- --------------- --------------- ---------------
SALES_A_BJIX    SALES_A         PROD_ID         PRODUCTS_A      PROD_ID
SALES_A_BJIX    SALES_A         PROMO_ID        PROMOTIONS_A    PROMO_ID
SALES_A_BJIX    SALES_A         CHANNEL_ID      CHANNELS_A      CHANNEL_ID

檢視新的執行計劃
使用點陣圖連線索引最佳化OLAP查詢


結論:點陣圖連線索引效能更佳。

注意:當where條件中包含點陣圖連線索引的相關列的篩選條件時(上例中是prod_id=27),才會使用點陣圖連線索引。如果沒有這一句,將走全表掃描。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2139014/,如需轉載,請註明出處,否則將追究法律責任。

相關文章