前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL优化案例-自定义函数索引(五)

SQL优化案例-自定义函数索引(五)

原创
作者头像
沃趣科技
发布2018-08-20 17:55:15
7210
发布2018-08-20 17:55:15
举报
文章被收录于专栏:沃趣科技沃趣科技

SQL文本如下,表本身很小,走全表扫描也很快,但因业务重要性,要求尽可能缩短查询时间(为保证客户隐私,已经将注释和文字部分去掉):

代码语言:javascript
复制
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;

执行计划如下:

可以看到谓词信息是客户号,可以确定此列选择性非常高,非常适合建立索引。

代码语言:javascript
复制
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并且取别名,查看函数创建语句:

代码语言:javascript
复制
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;

创建索引:

代码语言:javascript
复制
CREATE INDEX IDX_GETACCTNO ON IC_MERCHTRANSDETAIL_428 (GETACCTNOCY(ACTSTLACCTNO)) TABLESPACE TBSIDX;

创建索引后的执行计划如下:

案例较为简单,希望可以帮助到大家。

| 作者简介

姚崇·沃趣科技高级数据库技术专家

熟悉Oracle数据库内部机制,丰富的数据库及RAC集群层故障诊断、性能调优、OWI、数据库备份恢复及迁移经验。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • | 作者简介
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档