SQL最佳化案例-自定義函式索引(五)
SQL 文字如下,表本身很小,走全表掃描也很快,但因業務重要性,要求儘可能縮短查詢時間(為保證客戶隱私,已經將註釋和文字部分去掉):
SELECT MERCHCODE AS R_MERCHCODE, TRANDATE, TRANTIME, TRANTYPE AS TRANSTYPE, TRACENO, POSID AS R_POSID, ACCOUNT AS R_CARDNO, AMT, FEE, NVL(RESERVED1,'N') BORDERCARDBUSIFLAG, CASE WHEN I.BANCSRETFLAG='0000' THEN '1' WHEN I.BANCSRETFLAG='9999' THEN'0' ELSE '2' END AS RETURNCODE FROM IC_MERCHTRANSDETAIL_428 I WHERE GETACCTNO(ACTSTLACCTNO)=GETACCTNO('14250000000454865') AND ROWNUM < 500;
執行計劃如下:
可以看到謂詞資訊是客戶號,可以確定此列選擇性非常高,非常適合建立索引。
CREATE INDEX IDX_GETACCTNO ON IC_MERCHTRANSDETAIL_428 (GETACCTNO(ACTSTLACCTNO)) PARALLEL 10 TABLESPACE REPT * ERROR at line 1: ORA-30553: The function is not deterministic
確定函式本身不會受到不確定值的影響,建立函式索引。
加上 deterministic 並且取別名,檢視函式建立語句:
CREATE OR REPLACE FUNCTION GETACCTNOCY (acct varchar2) return varchar2 DETERMINISTIC is tmpacct varchar2(40); st_res varchar2(40); --st_res:=tmpacct begin tmpacct:=''; st_res :=''; IF (length(trim(acct))=16) THEN BEGIN SELECT ACCOUNT INTO tmpacct FROM LINK_L WHERE LINK_L.CARD=LPAD(trim(acct),20,0) AND ISO_TYPE='1' AND CATEGORY='0'; EXCEPTION WHEN NO_DATA_FOUND THEN tmpacct:=TRIM(ACCT); END; END IF; IF(length(trim(acct))>17) THEN BEGIN SELECT zh INTO tmpacct FROM load_zhmap WHERE jzh=trim(acct); EXCEPTION WHEN NO_DATA_FOUND THEN tmpacct:=''; END; END IF; IF(length(trim(acct))=17) THEN tmpacct:=substr(acct,1,16); END IF; st_res:=tmpacct; return st_res; EXCEPTION WHEN OTHERS THEN return ''; END;
建立索引:
CREATE INDEX IDX_GETACCTNO ON IC_MERCHTRANSDETAIL_428 (GETACCTNOCY(ACTSTLACCTNO)) TABLESPACE TBSIDX;
建立索引後的執行計劃如下:
案例較為簡單,希望可以幫助到大家。
| 作者簡介
姚崇·沃趣科技高階資料庫技術專家
熟悉Oracle資料庫內部機制,豐富的資料庫及RAC叢集層故障診斷、效能調優、OWI、資料庫備份恢復及遷移經驗。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2168587/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL優化案例-自定義函式索引(五)SQL優化函式索引
- Oracle優化案例-自定義函式索引(五)Oracle優化函式索引
- 函式索引使用細節——自定義函式的索引化函式索引
- SQL SERVER 自定義函式SQLServer函式
- SQL 自定義函式FUNCTIONSQL函式Function
- Sql Server系列:自定義函式SQLServer函式
- 自定義函式索引使用及其注意點函式索引
- MySQL使用之五_自定義函式和自定義過程MySql函式
- 單據列表呼叫自定義SQL函式SQL函式
- 案例展示自定義C函式的實現過程函式
- 對自定義函式使用不當的調優案例函式
- shell自定義函式函式
- Oracle 自定義函式Oracle函式
- perl自定義函式函式
- sql中select列有自定義函式 dblinkSQL函式
- T-SQL——自定義函式解析JSON字串SQL函式JSON字串
- Hive常用函式及自定義函式Hive函式
- SQL最佳化案例-分割槽索引之無字首索引(六)SQL索引
- SQL最佳化中索引列使用函式之靈異事件SQL索引函式事件
- SQL優化--函式索引SQL優化函式索引
- hive 3.0.0自定義函式Hive函式
- Hive中自定義函式Hive函式
- MySQL建立自定義函式MySql函式
- python 自定義函式Python函式
- oracle 自定義聚合函式Oracle函式
- mysql自定義函式篇MySql函式
- Oracle中自定義函式Oracle函式
- 一個自定義函式函式
- Oracle自定義聚集函式Oracle函式
- ORACLE 自定義函式BUG?Oracle函式
- 記錄一次 postgresql 最佳化案例( volatility 自定義函式無法並行查詢 )SQL函式並行
- SQL最佳化案例-正確的使用索引(二)SQL索引
- PHP 自定義函式用法及常用函式集合PHP函式
- java自定義equals函式和hashCode函式Java函式
- mysql 自定義分析函式 least 及 日期函式MySql函式AST
- laravel 自定義全域性函式Laravel函式
- Laravel 自定義函式存放位置Laravel函式
- Laravel 新增自定義助手函式Laravel函式