星期天看《expert one-on-one oracle》,發現以前建立的一個索引可能不合理,sql語句如下:
SELECT NVL (MAX (seeno), 0) + 1
FROM r_register
WHERE dept_code = :1
AND noon_code = :2
AND reglevl_code = :3
AND TRUNC (see_date) = :4
由于使用的是oracle
8.1.7的标準版,不支援函數索引,無法在trunc(see_date)建立索引,我以前建立了一個大索引(dept_code,
noon_code,reglevl_code,see_date,seeno),使用全索引(ffs)掃描。但是随着索引變大,執行時間越來越長,當使
用壓縮索引并且将索引改為(dept_code,noon_code,reglevl_code,seeno,see_date),壓縮前面4項,可以減
少掃描資料塊的數量。當我修改索引後,發現索引使用的塊數減少很多,
并且意外的發現執行計劃發生了變化,如下:
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=16)
1 0 SORT (AGGREGATE)
2 1 FIRST ROW (Cost=3 Card=5625 Bytes=90000)
3 2 INDEX (RANGE SCAN (MIN/MAX)) OF 'R_REGISTER_I_SEENO_DEPT_CODE_N' (NON-UNIQ
UE) (Cost=3 Card=5625)
這樣的話,發現每天執行會越來越快,但是我檢測了索引,還是存在變大(而且很快),不過我估計到一定程度變化不會太快。
最合理的方法還是修改sql語句。