作者: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相关推荐

  1. SOLIDWORKS如何简单高效地自动生成模型视图和标注

    模型视图是零件或装配体的工程图视图,当我们设计完成后,需要下发到生产车间进行生产时,往往就需要有一份详细且直观的工程图来指导生产加工. 你在工作中是否会经常思考这些问题? 1.激活模型视图后,为什么要 ...

  2. Oracle 自动生成标识列, 比如订单编号,学生ID

    Oracle 自动生成标识列, 比如订单编号,学生ID

  3. Oracle自动生成ID,自动编号,自增补零填充

    问题 在pl/sql中,需将某个查询结果插入到一个新表tableNameA中时,如何通过sql自动生成ID列,且形如:ID0001,ID0002,ID0003--. 解决方案 insert into ...

  4. oracle生成excle报表,oracle自动生成excel报表(时间为变量,条件含变量)

    目的:unix+oracle下每日生成前一天某统计报表,以一张统计表为例. ----在unix下执行sh脚本---- sqlplus -s username/password < @/home/ ...

  5. oracle自动生成uuid的方法

    1.创建一个表 create table t_user(id varchar2(200),name varchar2(200)); 2.生成uuid的语句 alter table t_user mod ...

  6. oracle自动生成拼音码,oracle 产生拼音码的函数

    create or replace function pro_f_getspell(vstr varchar2, --提交的字符串 vlen number) --返回字符串的长度 return var ...

  7. oracle导出建表主键,oracle主键自动生成 配合hibernate的生成策略详解

    hibernate配合oracle自动生成主键策略有两种方法: A)设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL, ...

  8. oracle 创建索引和视图

    一:    创建索引有两种方式: 1.    自动添加(oracle 会为主键和唯一约束自动添加索引) 自动创建的索引是无法手动删除的,但是当删除主键约束,唯一约束时,对应的索引也会自动删除: 2. ...

  9. 帆软填报报表实现日期自动生成总结

    帆软填报报表实现日期自动生成总结 文章目录 帆软填报报表实现日期自动生成总结 业务需求 思考过程 使用sysdate 使用触发器 V1 版本 创建时间设置 更新时间设置 填报报表设置 小bug修复 V ...

  10. oracle 插入表数据时,自动生成ID

    今天因为某些原因,需要把达梦数据库(oracle)里面的一张视图的大量数据某些字段插到另外一张表里面,但是又因为这张视图没有ID,插入表ID又不能为null,这时候就可以在插入的时候自动生成ID,记录 ...

最新文章

  1. js 动态校验开始结束时间
  2. 《JavaScript高效图形编程(修订版)》——6.10 用画布sprites取代DHTMLsprite
  3. VS(visual studio)如何查看预处理后的文件?(查看宏定义展开,头文件展开等)(注意如果要运行或调试代码,要把第一步的改回来!!!!)
  4. 状态压缩 DP AHU420
  5. 【8086汇编-Day6】关于loop的实验
  6. eslint检测node 内部模块报错解决方案
  7. java内存分配空间大小,JVM内存模型及内存分配过程
  8. 乐乐勇智能教育机器人有多少型号_【头条】协作机器人平台化趋势将会是柔性自动化的破局之道...
  9. 计算机专业的学生该选择日后的人生道路?继续从事IT还是考公务员……
  10. 物联网技术,主要应用于哪十大行业
  11. 拷贝构造函数——防篡改
  12. 《数据挖掘导论》实验课——实验七、数据挖掘之K-means聚类算法
  13. 对“最大子序列和问题”的一点思考
  14. Head First Design Pattern: 策略模式
  15. 常用plc编程软件阵营划分
  16. 人工智能导论学习笔记
  17. Python常用模块库
  18. 从本质出发理解掌握三大坐标系下的三大方程(三)--旋度公式
  19. Ebean报错java.lang.ClassCastException: com.project.model.xxx cannot be cast to com.project.model.xxx
  20. 关于前端授权获取微信用户信息实践

热门文章

  1. 商用平板 移动金融潜力巨大的应用平台
  2. MySQL 如何查看表的存储引擎
  3. 关于 Android Service 的介绍都在这了
  4. 简单的Python购物流程
  5. UpdatePanelAnimation
  6. .NET 源代码的安全性(源代码工具真正比拼) (論)
  7. php 图形用户界面GUI 开发
  8. ASP.NET【2】
  9. 《移动平台开发实践》第2周作业
  10. 解决VB6.0中不能加载MSCOMCTL.OCX的错误提示