Oracle 自动生成的视图VM_NSO_1
作者:Jerry
有时候优化sql的时候,在执行计划中看到有VM_NSO_X的视图,在Oracle定义中,可以吧NSO理解为nested subquery optimizing,功能就是把in转换为join,把not in转换为anti join等,当然转换的时候有一定的限制。下面我们来简单看下会生成VM_NSO_1视图的几个例子
1. 创建2个测试表
SQL> create table test_jerry as select * from dba_objects;Table created.SQL> create table test_jerry2 as select * from dba_objects;Table created.SQL> select count(*) from test_jerry where object_id not in (select max(object_id) from test_jerry2 group by owner);Execution Plan ---------------------------------------------------------- Plan hash value: 3525080607------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 26 | | 908 (1)| 00:00:11 | | 1 | SORT AGGREGATE | | 1 | 26 | | | | |* 2 | HASH JOIN RIGHT ANTI NA| | 89846 | 2281K| 2144K| 908 (1)| 00:00:11 | | 3 | VIEW | VW_NSO_1 | 87509 | 1110K| | 349 (1)| 00:00:05 | | 4 | HASH GROUP BY | | 87509 | 2563K| | 349 (1)| 00:00:05 | | 5 | TABLE ACCESS FULL | TEST_JERRY2 | 87509 | 2563K| | 347 (1)| 00:00:05 | | 6 | TABLE ACCESS FULL | TEST_JERRY | 89847 | 1140K| | 347 (1)| 00:00:05 | ------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): ---------------------------------------------------2 - access("OBJECT_ID"="MAX(OBJECT_ID)")Note ------ dynamic sampling used for this statement (level=2)Statistics ----------------------------------------------------------0 recursive calls0 db block gets2490 consistent gets2484 physical reads0 redo size528 bytes sent via SQL*Net to client524 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processedSQL> select count(*) from test_jerry where object_id not in (select max(object_id) from test_jerry2);Execution Plan ---------------------------------------------------------- Plan hash value: 3071647562------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 13 | 694 (1)| 00:00:09 | | 1 | SORT AGGREGATE | | 1 | 13 | | | |* 2 | TABLE ACCESS FULL | TEST_JERRY | 4492 | 58396 | 347 (1)| 00:00:05 | | 3 | SORT AGGREGATE | | 1 | 13 | | | | 4 | TABLE ACCESS FULL| TEST_JERRY2 | 87509 | 1110K| 347 (1)| 00:00:05 | ------------------------------------------------------------------------------------ Predicate Information (identified by operation id): ---------------------------------------------------2 - filter("OBJECT_ID"<> (SELECT MAX("OBJECT_ID") FROM "TEST_JERRY2""TEST_JERRY2"))Note ------ dynamic sampling used for this statement (level=2)Statistics ----------------------------------------------------------7 recursive calls0 db block gets2629 consistent gets2484 physical reads0 redo size528 bytes sent via SQL*Net to client524 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processedSQL> select count(*) from test_jerry where object_id in (select object_id from test_jerry2 where owner='SYS' minus select object_id from test_jerry where owner='SCOTT');Execution Plan ---------------------------------------------------------- Plan hash value: 773093838---------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 26 | | 1307 (1)| 00:00:16 | | 1 | SORT AGGREGATE | | 1 | 26 | | | | |* 2 | HASH JOIN | | 32153 | 816K| | 1307 (1)| 00:00:16 | | 3 | VIEW | VW_NSO_1 | 32153 | 408K| | 960 (1)| 00:00:12 | | 4 | MINUS | | | | | | | | 5 | SORT UNIQUE | | 32153 | 941K| 1272K| | | |* 6 | TABLE ACCESS FULL| TEST_JERRY2 | 32153 | 941K| | 347 (1)| 00:00:05 | | 7 | SORT UNIQUE | | 14 | 420 | | | | |* 8 | TABLE ACCESS FULL| TEST_JERRY | 14 | 420 | | 347 (1)| 00:00:05 | | 9 | TABLE ACCESS FULL | TEST_JERRY | 89847 | 1140K| | 347 (1)| 00:00:05 | ---------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): ---------------------------------------------------2 - access("OBJECT_ID"="OBJECT_ID")6 - filter("OWNER"='SYS')8 - filter("OWNER"='SCOTT')Note ------ dynamic sampling used for this statement (level=2)Statistics ----------------------------------------------------------93 recursive calls0 db block gets4691 consistent gets3726 physical reads0 redo size528 bytes sent via SQL*Net to client524 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client12 sorts (memory)0 sorts (disk)1 rows processedSQL> select count(*) from test_jerry where object_id in (select object_id from test_jerry2 where owner='SYS' union all select object_id from test_jerry where owner='SCOTT');Execution Plan ---------------------------------------------------------- Plan hash value: 1173723582-------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 26 | 1041 (1)| 00:00:13 | | 1 | SORT AGGREGATE | | 1 | 26 | | | |* 2 | HASH JOIN | | 32167 | 816K| 1041 (1)| 00:00:13 | | 3 | VIEW | VW_NSO_1 | 32167 | 408K| 694 (1)| 00:00:09 | | 4 | HASH UNIQUE | | 32167 | 942K| 694 (1)| 00:00:09 | | 5 | UNION-ALL | | | | | | |* 6 | TABLE ACCESS FULL| TEST_JERRY2 | 32153 | 941K| 347 (1)| 00:00:05 | |* 7 | TABLE ACCESS FULL| TEST_JERRY | 14 | 420 | 347 (1)| 00:00:05 | | 8 | TABLE ACCESS FULL | TEST_JERRY | 89847 | 1140K| 347 (1)| 00:00:05 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): ---------------------------------------------------2 - access("OBJECT_ID"="OBJECT_ID")6 - filter("OWNER"='SYS')7 - filter("OWNER"='SCOTT')Note ------ dynamic sampling used for this statement (level=2)Statistics ----------------------------------------------------------82 recursive calls0 db block gets4669 consistent gets3726 physical reads0 redo size527 bytes sent via SQL*Net to client524 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client8 sorts (memory)0 sorts (disk)1 rows processed SQL> select count(*) from test_jerry where object_id in (SELECT LEVEL FROM DUAL CONNECT BY LEVEL<100); Execution Plan ---------------------------------------------------------- Plan hash value: 3708743834-------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 26 | 350 (1)| 00:00:05 | | 1 | SORT AGGREGATE | | 1 | 26 | | | |* 2 | HASH JOIN | | 1 | 26 | 350 (1)| 00:00:05 | | 3 | VIEW | VW_NSO_1 | 1 | 13 | 3 (34)| 00:00:01 | | 4 | HASH UNIQUE | | 1 | | 3 (34)| 00:00:01 | |* 5 | CONNECT BY WITHOUT FILTERING (UNIQUE)| | | | | | | 6 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 | | 7 | TABLE ACCESS FULL | TEST_JERRY | 89847 | 1140K| 347 (1)| 00:00:05 | -------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): ---------------------------------------------------2 - access("OBJECT_ID"="LEVEL")5 - filter(LEVEL<100)Note ------ dynamic sampling used for this statement (level=2)Statistics ----------------------------------------------------------4 recursive calls0 db block gets1315 consistent gets1242 physical reads0 redo size526 bytes sent via SQL*Net to client524 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client1 sorts (memory)0 sorts (disk)1 rows processed
可以从上面的sql得出一个简单的结论,当子查询中出现max,rownum,group by,union all,minus,intersect等聚合函数的时候,Oracle就会自动把子查询转换成视图VM_NSO_X,其实在Oracle的子查询中如果出现上面的几种情况,也就限制了view merge,就无法对视图进行merge。如果需要去掉CBO生成VM_NSO_1,只需要在子查询中加一个no_unnest限制,这样CBO就会走filter了。下面看一个加了no_unnest的执行计划
SQL> select count(*) from test_jerry where object_id in (SELECT /*+ no_unnest() */ LEVEL FROM DUAL t CONNECT BY LEVEL<100);Execution Plan ---------------------------------------------------------- Plan hash value: 2000702637------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 13 | 5963 (1)| 00:01:12 | | 1 | SORT AGGREGATE | | 1 | 13 | | | |* 2 | FILTER | | | | | | | 3 | TABLE ACCESS FULL | TEST_JERRY | 89847 | 1140K| 347 (1)| 00:00:05 | |* 4 | FILTER | | | | | | |* 5 | CONNECT BY WITHOUT FILTERING (UNIQUE)| | | | | | | 6 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 | ------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): ---------------------------------------------------2 - filter( EXISTS (SELECT /*+ NO_UNNEST */ 0 FROM "SYS"."DUAL" "T" WHERE LEVEL=:B1 CONNECTBY LEVEL<100))4 - filter(LEVEL=:B1)5 - filter(LEVEL<100)Note ------ dynamic sampling used for this statement (level=2)Statistics ----------------------------------------------------------7 recursive calls0 db block gets1385 consistent gets1242 physical reads0 redo size526 bytes sent via SQL*Net to client524 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client86968 sorts (memory)0 sorts (disk)1 rows processed
- 本文固定链接: http://www.savedba.com/?p=824
- 转载请注明: 版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
转载于:https://www.cnblogs.com/lxl57610/p/7464117.html
Oracle 自动生成的视图VM_NSO_1相关推荐
- SOLIDWORKS如何简单高效地自动生成模型视图和标注
模型视图是零件或装配体的工程图视图,当我们设计完成后,需要下发到生产车间进行生产时,往往就需要有一份详细且直观的工程图来指导生产加工. 你在工作中是否会经常思考这些问题? 1.激活模型视图后,为什么要 ...
- Oracle 自动生成标识列, 比如订单编号,学生ID
Oracle 自动生成标识列, 比如订单编号,学生ID
- Oracle自动生成ID,自动编号,自增补零填充
问题 在pl/sql中,需将某个查询结果插入到一个新表tableNameA中时,如何通过sql自动生成ID列,且形如:ID0001,ID0002,ID0003--. 解决方案 insert into ...
- oracle生成excle报表,oracle自动生成excel报表(时间为变量,条件含变量)
目的:unix+oracle下每日生成前一天某统计报表,以一张统计表为例. ----在unix下执行sh脚本---- sqlplus -s username/password < @/home/ ...
- oracle自动生成uuid的方法
1.创建一个表 create table t_user(id varchar2(200),name varchar2(200)); 2.生成uuid的语句 alter table t_user mod ...
- oracle自动生成拼音码,oracle 产生拼音码的函数
create or replace function pro_f_getspell(vstr varchar2, --提交的字符串 vlen number) --返回字符串的长度 return var ...
- oracle导出建表主键,oracle主键自动生成 配合hibernate的生成策略详解
hibernate配合oracle自动生成主键策略有两种方法: A)设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL, ...
- oracle 创建索引和视图
一: 创建索引有两种方式: 1. 自动添加(oracle 会为主键和唯一约束自动添加索引) 自动创建的索引是无法手动删除的,但是当删除主键约束,唯一约束时,对应的索引也会自动删除: 2. ...
- 帆软填报报表实现日期自动生成总结
帆软填报报表实现日期自动生成总结 文章目录 帆软填报报表实现日期自动生成总结 业务需求 思考过程 使用sysdate 使用触发器 V1 版本 创建时间设置 更新时间设置 填报报表设置 小bug修复 V ...
- oracle 插入表数据时,自动生成ID
今天因为某些原因,需要把达梦数据库(oracle)里面的一张视图的大量数据某些字段插到另外一张表里面,但是又因为这张视图没有ID,插入表ID又不能为null,这时候就可以在插入的时候自动生成ID,记录 ...
最新文章
- js 动态校验开始结束时间
- 《JavaScript高效图形编程(修订版)》——6.10 用画布sprites取代DHTMLsprite
- VS(visual studio)如何查看预处理后的文件?(查看宏定义展开,头文件展开等)(注意如果要运行或调试代码,要把第一步的改回来!!!!)
- 状态压缩 DP AHU420
- 【8086汇编-Day6】关于loop的实验
- eslint检测node 内部模块报错解决方案
- java内存分配空间大小,JVM内存模型及内存分配过程
- 乐乐勇智能教育机器人有多少型号_【头条】协作机器人平台化趋势将会是柔性自动化的破局之道...
- 计算机专业的学生该选择日后的人生道路?继续从事IT还是考公务员……
- 物联网技术,主要应用于哪十大行业
- 拷贝构造函数——防篡改
- 《数据挖掘导论》实验课——实验七、数据挖掘之K-means聚类算法
- 对“最大子序列和问题”的一点思考
- Head First Design Pattern: 策略模式
- 常用plc编程软件阵营划分
- 人工智能导论学习笔记
- Python常用模块库
- 从本质出发理解掌握三大坐标系下的三大方程(三)--旋度公式
- Ebean报错java.lang.ClassCastException: com.project.model.xxx cannot be cast to com.project.model.xxx
- 关于前端授权获取微信用户信息实践