oracle库函数,Oracle:函数目录
这个语句还能优化嘛?
原语句:
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:函数目录相关推荐
- oracle视图执行脚本,oracle 视图,函数,过程,触发器自动编译脚本
日常管理维护一个oracle数据库服务器的时,经常会碰到修改view,table结构的情况,而且由于oracle view,函数,存储过程等对象的相互关联的关系,经常会由于一个view,table,f ...
- Oracle中todate函数的使用
Oracle to_date()函数的用法 2010-10-25 16:13 佚名 互联网 我要评论(0) 字号:T | T 一键收藏,随时查看,分享好友! to_date()是Oracle数据库函数 ...
- 数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引
1. oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的 ...
- php instr函数,oracle的instr函数用法
这几天在做一个项目的时候,做到关于用户组权限分配的问题,用到了Oracle的instr函数,现在好好学习下这个函数吧. 在Oracle/PLSQL中, instr 函数返回要截取的字符串在源字符串中的 ...
- 先随机后排序的oracle,Oracle用decode函数或CASE-WHEN实现自定义排序
Oracle用decode函数或CASE-WHEN实现自定义排序 1 问题 对SQL排序,只要在order by后面加字段就可以了,可以通过加desc或asc来选择降序或升序.但排序规则是默认的,数字 ...
- mysql中tonumber函数_Oracle数据库之oracle的TO_NUMBER函数
本文主要向大家介绍了Oracle数据库之oracle的TO_NUMBER函数,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. TO_NUMBER(x [, format], [ ...
- Oracle to_char格式化函数
Oracle to_char格式化函数 Postgres 格式化函数提供一套有效的工具用于把各种数据类型(日期/时间,int,float,numeric)转换成格式化的字符串以及反过来从格式化的字符串 ...
- Oracle的sql 函数
Oracle的SQL函数 Oracle的SQL函数分为单行函数和多行函数.单行函数只对单条记录有效,多行函数对多条记录有效. 单行函数包括,字符.数字.日期.转换和普通函数. 字符函数举例: ?全小写 ...
- oracle的listagg函数
今天需要将 BDST_ID相同的PROJECT_ID用逗号分隔拼成一个字符串,于是想到了oracle的listagg函数 表名为PM_BDST_PROJECT select tt.BDST_ID, l ...
最新文章
- 小米AIoT开发者大会28日召开,雷军的AIoT和小米的这一年
- windows server 远程桌面安装和配置
- 梯度下降 最小二乘法 matlab,最小二乘法和梯度下降法的理解
- Node读取并输出txt文件内容
- Session的异常
- 文件包含(include require)
- SemVLP 单流和双流Transformer哪个好?阿里:我全都要!提出带可插拔模块的Transformer结构...
- 对Leader的闲话
- java 如何去掉http debug日志_你居然还去服务器上捞日志,搭个日志收集系统难道不香么!...
- php事务和回滚,php – Mysql事务:提交和回滚
- 如何在分屏浏览中并排使用两个Mac软件界面
- 高级商务办公软件应用【12】
- 黑屏后面藏了什么?--解读微软打击盗版
- 怎么用电脑录制游戏视频
- 【趣题】红蓝眼岛居民自杀事件
- 虚拟机M0n0wall软件防火墙配置
- 边缘计算在自动驾驶中的应用场景丨边缘计算阅读周
- java 熔断器模式_Spring Cloud Hystrix——熔断器
- 【英语竞赛】专项练习之翻译
- 阿里云服务器详细地址在哪里?华南1深圳服务器详细地址
热门文章
- 【干货】直播聊天室详细分解,让你一眼学会快速搭建!
- PHP错题本功能实现,今天教你如何制作错题本!
- 湖南多校对抗赛(2014.03.16) C.Pings
- 主动防御与启发式查毒
- mysql中depart_数据库问题:提问:MYSQL 建立外键出现1064错误,建立外键的时候员工表的depart和部门表的depart连接失败...
- PC电脑端常见蓝屏代码自检测与解决方案
- Pulmonary--Detection6
- 数据加密解决方案有哪些?
- Office365 InfoPath 表单的设计和应用(原创)
- JavaMail详解