復合索引 復合索引順序選擇問題

2021-09-01 07:17:01 字數 2185 閱讀 9611

[color=red][b]注意!!!

在較高版本的oracle中不存在下述的問題!!![/b][/color]

復合索引第乙個原則:字首性(prefixing)

[color=red]復合索引的字首性是指只有當復合索引的第乙個字段出現在sql語句的謂詞條件中時,該索引才會被用到。

如復合索引為(ename,job,mgr),只要謂詞條件中出現第乙個欄位ename,就可以用復合索引,否則不會用。

唯一的例外是skip scan index,就是如果oracle發現第乙個欄位的值很少,會自動拆分為兩個復合索引。如復合索引(gender,ename,job,mgr),因為第乙個欄位gender只有兩個值:男和女,因此oracle會將這個索引拆分成('男',ename,job,mgr)和('女',ename,job,mgr)兩個復合索引,這樣即使gender沒有出現在謂詞條件中,也可以用該復合索引。[/color]

skip scan是oracle針對特定條件上索引結構,所提供的一種備選搜尋操作。skip scan的使用不是規則,而是成本估算。index skip scan是oracle提供的一種執行計畫操作,可以應用在執行計畫的生成中。簡單的說,就是oracle將sql描述語句轉化為可執行操作序列(執行計畫)過程中乙個操作選擇。

復合索引第二個規則:可選性(selectivity)

[color=red]oracle建議復合索引應按字段可選性(即值的多少)的高低進行排列,這是因為,字段值越多,可選性越強,定位的記錄就越少,查詢效率就越高。[/color]

********************====

我先從底層看起。好老的環境哦,還是oracle 8.0.6。硬體配置還可以,ibm rs6000機器,4cpu/2g。你才上海乙個區的資料嘛,才幾個g,處理能力肯定沒問題。再看資料庫引數,乖乖,從未調過啊。這不相當於把賓士車常年掛在一檔開嗎?調引數很簡單,但oracle 8.0.6需要重新啟動,白天業務期間無法做。只好看應用了,當然也是我期待已久的。8.0.6在效能分析方面比較土,只能用蹩腳的utlbstat,utlestat指令碼,或者直接去檢視裡分析。我當然不會象前面的洋『忽悠』一樣,去查詢內部檢視,況且我乙個人呆在黑古隆冬的機房裡,想做秀也沒人看啊。還是那句話,發現問題並不難,難得是分析和解決問題。喏,以下就是當時在10:00多業務高峰時的一些最消耗資源的語句:

begin htjs.fp_qmkcjz_t(:1,:2,:3); end

select count(*) from htjs.fp_qylyc where nsrsbh = :b1 and yf = :2 and sflb != 's';

select fp_dm, qs_hm,fp_sl from htjs.fp_qylyc where yf=:b1 and sflb = 's' and fp_zl = 's' and nsrsbh = :b2;

select swjg_dm,fp_dm,fp_qs_hm,fp_sl,sflb from htjs.fp_sfd where to_char(sfrq,'yyyymm') = to_char(:b1) and nsrsbh = :b2 and (sflb = '12' or sflb = '21' ) and oldflag = '0' order by id;

select max(bsyf) from htjs.cb_qy_bsqk_tjb where nsrsbh = :b1;

以上述第2,3條sql語句為例,當時系統已經在htjs.fp_qylyc表的如下欄位上按順序建立了乙個復合索引:

yf ----- 月份

swjg_dm ----- 稅務機關_**

nsrsbh ----- 納稅人識別號

fp_dm ----- 發票_**

sflb ----- 收費類別

qs_hm ----- xx_號碼

看出問題了吧?雖然兩條語句都含yf(月份)字段,符合字首性原則,但oracle實際上沒有使用該索引,因為同一月份記錄太多了,還不如全表掃瞄。更重要的是,該復合索引的字段順序的設計上根本沒有考慮各字段的可選性。於是,我當時新建了乙個索引:create index ora_fp_qylyc_2 on fp_qylyc(nsrsbh ,yf,sflb,fp_zl) tablespace fpfs;

**********=

效果評估:

前端應用軟體反應速度由30秒下降為不足1秒。

cpu平均利用率由50%下降為5%。

i/o量急劇下降。

上述語句從最消耗資源的語句列表中消失。

索引,復合索引

這裡只看btree索引,至於雜湊索引和全文索引本文暫不討論。前言 索引是有效使用資料庫的基礎,但你的資料量很小的時候,或許通過掃瞄整表來訪問資料的效能還能接受,但當資料量極大時,當訪問量極大時,就一定需要通過索引的輔助才能有效地訪問資料。一般索引建立的好壞是效能好壞的成功關鍵。使用innodb作為資...

復合索引(組合索引)

使用者可以在多個列上建立索引,這種索引叫做復合索引 組合索引 1.何時是用復合索引 在where條件中字段用索引,如果用多字段就用復合索引。比如在查詢位址的時候,經常要求輸入省,市資訊,如果同時在省,市上建立索引,將會提高查詢速度。2.對於復合索引,在查詢使用時,最好將條件順序按找索引的順序,這樣效...

復合索引(組合索引)

使用者可以在多個列上建立索引,這種索引叫做復合索引 組合索引 1.何時是用復合索引 在where條件中字段用索引,如果用多字段就用復合索引。比如在查詢位址的時候,經常要求輸入省,市資訊,如果同時在省,市上建立索引,將會提高查詢速度。2.對於復合索引,在查詢使用時,最好將條件順序按找索引的順序,這樣效...