这个语句还能优化嘛?

原语句:

select b.*

from test1 a,test2 b

where a.sflag ='-3'

and instr(','||a.id||',',','||b.certiid||',')>0;

通过执行发现test2表执行了全表扫描,需要120秒通过分析发现是test2的certiid列上实际上是有索引的。

但是它不能使用这个索引,不能通过索引的ROWID来搜索表,因为这里并没有b.certiid等于的条件,而是通过

条件instr(','||a.id||',',','||b.certiid||',')>0进行的连接。

然后考虑到需要返回的值是B.*而索引只包含了CERTIID列,索引INDEX FAST SCAN也用不到。

所以我们这里考虑修改如下:

select * from  test2 where certiid in(

select b.certiid

from test1 a,test2 b

where a.sflag ='-3'

and instr(','||a.id||',',','||b.certiid||',')>0);

PLAN_TABLE_OUTPUT

----------------------------------------------------------------

SQL_ID  gsha1gj68gacg, child number 0

-------------------------------------

select /*+  gather_plan_statistics */  *   from test2  where certiid in        (select

b.certiid           from test1 a, test2 b          where a.sflag = '-3'            and

instr(',' || a.id || ',', ',' || b.certiid || ',') > 0)

Plan hash value: 4074250259

----------------------------------------------------------------

| Id  | Operation                       | Name            | Starts | E-Rows | A-Rows |   A-Time   | Buffers |

----------------------------------------------------------------

PLAN_TABLE_OUTPUT

----------------------------------------------------------------

|   0 | SELECT STATEMENT                |                 |      1 |        |     54 |00:00:32.69 |     133K|

|   1 |  NESTED LOOPS                   |                 |      1 |      1 |     54 |00:00:32.69 |     133K|

|   2 |   VIEW                          | VW_NSO_1        |      1 |      1 |     54 |00:00:32.69 |     133K|

|   3 |    HASH UNIQUE                  |                 |      1 |      1 |     54 |00:00:32.69 |     133K|

|   4 |     NESTED LOOPS                |                 |      1 |      1 |     54 |00:00:28.67 |     133K|

|   5 |      TABLE ACCESS BY INDEX ROWID| test1      |      1 |      1 |     38 |00:00:00.01 |      49 |

|*  6 |       INDEX RANGE SCAN          | INDEX_SFLAG     |      1 |      1 |     38 |00:00:00.01 |       3 |

|*  7 |      INDEX FAST FULL SCAN       | PK_test2 |     38 |  24575 |     54 |00:00:25.65 |     133K|

|   8 |   TABLE ACCESS BY INDEX ROWID   | test2    |     54 |      1 |     54 |00:00:00.01 |     167 |

|*  9 |    INDEX UNIQUE SCAN            | PK_test2 |     54 |      1 |     54 |00:00:00.01 |     113 |

----------------------------------------------------------------

PLAN_TABLE_OUTPUT

----------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

6 - access("A"."SFLAG"='-3')

7 - filter(INSTR(','||"A"."ID"||',',','||"B"."CERTIID"||',')>0)

9 - access("CERTIID"="$nso_col_1")

这里使用了一个子查询,子查询中使用的条件不是B.*而是B.certiid.可以看到这里使用了 INDEX FAST FULL SCAN,相当于把

索引当表来进行扫描,不考虑索引的结构。但是这里的一列的‘表’比所有字段的表要小得多所以也加快了查询。

修改后得语句任然有性能问题,看到这里的

INDEX FAST FULL SCAN       | PK_test2 |     38

在NESTED LOOP的机制下运行了38次。本来想通过HASH JION来代替NESTED LOOPS 但是这里条件是INSTR(','||"A"."ID"||',',','||"B"."CERTIID"||',')>0,所以不好修改了。

修改后语句运行的时间由120秒降低到48秒,不知道还有优化的方法没?

原执行计划:

PLAN_TABLE_OUTPUT

--------------------------------------------

Plan hash value: 1212030027

--------------------------------------------

| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU

--------------------------------------------

|   0 | SELECT STATEMENT             |              |  3943K|  1921M|  1384K  (1

|   1 |  NESTED LOOPS                |              |  3943K|  1921M|  1384K  (1

|   2 |   TABLE ACCESS BY INDEX ROWID| test1   |    71 |  1278 |     5   (0

|*  3 |    INDEX RANGE SCAN          | INDEX_SFLAG  |    71 |       |     3   (0

|*  4 |   TABLE ACCESS FULL          | test2 | 55470 |    26M| 19504   (1

--------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

3 - access("A"."SFLAG"='-3')

4 - filter(INSTR(','||"A"."ID"||',',','||"B"."CERTIID"||',')>0)

17 rows selected

http://www.itpub.net/thread-1477884-1-9.html

oracle库函数,Oracle:函数目录相关推荐

  1. oracle视图执行脚本,oracle 视图,函数,过程,触发器自动编译脚本

    日常管理维护一个oracle数据库服务器的时,经常会碰到修改view,table结构的情况,而且由于oracle view,函数,存储过程等对象的相互关联的关系,经常会由于一个view,table,f ...

  2. Oracle中todate函数的使用

    Oracle to_date()函数的用法 2010-10-25 16:13 佚名 互联网 我要评论(0) 字号:T | T 一键收藏,随时查看,分享好友! to_date()是Oracle数据库函数 ...

  3. 数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

    1.    oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的 ...

  4. php instr函数,oracle的instr函数用法

    这几天在做一个项目的时候,做到关于用户组权限分配的问题,用到了Oracle的instr函数,现在好好学习下这个函数吧. 在Oracle/PLSQL中, instr 函数返回要截取的字符串在源字符串中的 ...

  5. 先随机后排序的oracle,Oracle用decode函数或CASE-WHEN实现自定义排序

    Oracle用decode函数或CASE-WHEN实现自定义排序 1 问题 对SQL排序,只要在order by后面加字段就可以了,可以通过加desc或asc来选择降序或升序.但排序规则是默认的,数字 ...

  6. mysql中tonumber函数_Oracle数据库之oracle的TO_NUMBER函数

    本文主要向大家介绍了Oracle数据库之oracle的TO_NUMBER函数,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. TO_NUMBER(x [, format], [  ...

  7. Oracle to_char格式化函数

    Oracle to_char格式化函数 Postgres 格式化函数提供一套有效的工具用于把各种数据类型(日期/时间,int,float,numeric)转换成格式化的字符串以及反过来从格式化的字符串 ...

  8. Oracle的sql 函数

    Oracle的SQL函数 Oracle的SQL函数分为单行函数和多行函数.单行函数只对单条记录有效,多行函数对多条记录有效. 单行函数包括,字符.数字.日期.转换和普通函数. 字符函数举例: ?全小写 ...

  9. oracle的listagg函数

    今天需要将 BDST_ID相同的PROJECT_ID用逗号分隔拼成一个字符串,于是想到了oracle的listagg函数 表名为PM_BDST_PROJECT select tt.BDST_ID, l ...

最新文章

  1. 小米AIoT开发者大会28日召开,雷军的AIoT和小米的这一年
  2. windows server 远程桌面安装和配置
  3. 梯度下降 最小二乘法 matlab,最小二乘法和梯度下降法的理解
  4. Node读取并输出txt文件内容
  5. Session的异常
  6. 文件包含(include require)
  7. SemVLP 单流和双流Transformer哪个好?阿里:我全都要!提出带可插拔模块的Transformer结构...
  8. 对Leader的闲话
  9. java 如何去掉http debug日志_你居然还去服务器上捞日志,搭个日志收集系统难道不香么!...
  10. php事务和回滚,php – Mysql事务:提交和回滚
  11. 如何在分屏浏览中并排使用两个Mac软件界面
  12. 高级商务办公软件应用【12】
  13. 黑屏后面藏了什么?--解读微软打击盗版
  14. 怎么用电脑录制游戏视频
  15. 【趣题】红蓝眼岛居民自杀事件
  16. 虚拟机M0n0wall软件防火墙配置
  17. 边缘计算在自动驾驶中的应用场景丨边缘计算阅读周
  18. java 熔断器模式_Spring Cloud Hystrix——熔断器
  19. 【英语竞赛】专项练习之翻译
  20. 阿里云服务器详细地址在哪里?华南1深圳服务器详细地址

热门文章

  1. 【干货】直播聊天室详细分解,让你一眼学会快速搭建!
  2. PHP错题本功能实现,今天教你如何制作错题本!
  3. 湖南多校对抗赛(2014.03.16) C.Pings
  4. 主动防御与启发式查毒
  5. mysql中depart_数据库问题:提问:MYSQL 建立外键出现1064错误,建立外键的时候员工表的depart和部门表的depart连接失败...
  6. PC电脑端常见蓝屏代码自检测与解决方案
  7. Pulmonary--Detection6
  8. 数据加密解决方案有哪些?
  9. Office365 InfoPath 表单的设计和应用(原创)
  10. JavaMail详解