昨天晚上帮一位兄弟优化一个ebs的sql。

sql有好几百行。

SQL的样子是select .... from 视图 where ....过滤条件

视图的代码贴出来就不给大家看了,比較长。另外设计保密


那个sql要跑几十秒。

然后那位兄弟把视图代码弄出来。再加过滤条件,0.2秒出结果。 他搞了半天没搞出来。

那位兄弟看运行计划用 plsql 工具 F5 查看。

----记住这句话。谁用F5看运行计划谁就是菜鸟。之后通过查看 explain plan for ...这样的运行计划解决这个问题

该问题相似:

sqlplus / as sysdba

grant dba to scott;

sqlplus scott/tiger

create table test as select * from dba_objects;

SQL> create table test as select * from dba_objects;

表已创建。

create or replace view push_test as select rownum as id,
a.* from test a; SQL> create or replace view push_test as select rownum as id,
2 a.* from test a; 视图已创建。 create index idx_object_id on test(object_id); SQL> set lines 200 pages 200
SQL> set autot trace
SQL> select * from push_test where object_id=2; 运行计划
----------------------------------------------------------
Plan hash value: 677040414 ---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 69219 | 14M| 291 (1)| 00:00:04 |
|* 1 | VIEW | PUSH_TEST | 69219 | 14M| 291 (1)| 00:00:04 |
| 2 | COUNT | | | | | |
| 3 | TABLE ACCESS FULL| TEST | 69219 | 13M| 291 (1)| 00:00:04 |
--------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - filter("OBJECT_ID"=2) Note
-----
- dynamic sampling used for this statement (level=6) 统计信息
----------------------------------------------------------
338 recursive calls
0 db block gets
1323 consistent gets
1033 physical reads
0 redo size
1459 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed create or replace view push2_test as select
a.* from test a; SQL> create or replace view push2_test as select
2 a.* from test a; 视图已创建。 SQL> select * from push2_test where object_id=2; 运行计划
----------------------------------------------------------
Plan hash value: 985375477 ---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 207 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 207 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_OBJECT_ID | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("A"."OBJECT_ID"=2) Note
-----
- dynamic sampling used for this statement (level=6) 统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
1403 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

意思就是说 在视图 创建的时候 select rownum as ..... 多了这个ROWNUM 导致过滤条件推入不进视图,仅仅能在视图外面过滤。 怎么看在外面过滤呢?

SQL> select * from push_test where object_id=2;

运行计划
----------------------------------------------------------
Plan hash value: 677040414 ---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 69219 | 14M| 291 (1)| 00:00:04 |
|* 1 | VIEW | PUSH_TEST | 69219 | 14M| 291 (1)| 00:00:04 |
| 2 | COUNT | | | | | |
| 3 | TABLE ACCESS FULL| TEST | 69219 | 13M| 291 (1)| 00:00:04 |
--------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - filter("OBJECT_ID"=2) Note
-----
- dynamic sampling used for this statement (level=6) 统计信息
----------------------------------------------------------
338 recursive calls
0 db block gets
1323 consistent gets
1033 physical reads
0 redo size
1459 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

看ID=1 这里 view 前面有* ,*就表示过滤。 * 在view前面,说明过滤是在view上面过滤,而不是在里面过滤的。这个就导致跑得慢了。

由于视图里面有rownum,CBO 必须做一个count操作,这个时候无法进行谓词推入。由于推入了。原始sql语句意义变化。

终于征求那位哥们意见。是否能去掉 视图的 rownum ,假设能去掉。就能优化。假设不能去掉,那sql无法优化。

终于肯定是 干掉了。

记住了。 视图的select后面最好不要包括rownum,否则无法谓词推入。

视图中使用ROWNUM要注意的更多相关文章

  1. ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入

    原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...

  2. YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

    上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...

  3. mvc Razor 视图中找不到 ViewBag的定义

    在Razor 视图中,我们有时会看到 ViewBag.Title 下会划一个红线,当鼠标放上去的时候会提示这样的一个错误: 找不到编译动态表达式所需的一种或多种类型,是否缺少引用? 但在项目启动运行时 ...

  4. ORACLE DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象查看

    在ORACLE数据库中,DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象是什么东西呢?其实OBJECT_TYPE为LOB就是大对象(LOB),它指那些用来存储大量数据的数据库字段.下面 ...

  5. [转]Oracle中使用Rownum分页详细例子

    原文地址:http://www.jb51.net/article/52272.htm 在MySQL中,我们通常都使用limit来完成数据集获取的分页操作,而在Oracle数据库中,并没有类似limit ...

  6. MVC视图中读取ViewBag传递过来的HashTable表数据

    视图中头部添加 @using System.Collections; 循环读取哈希表数据 <ul id="AccessView" class="sys_spec_t ...

  7. ora-01445:无法从不带保留关键字的表的连接视图中选择ROWID或采样

    系统要创建一个物化试图,用到很多张表,执行的时候报错:   ora-01445:无法从不带保留关键字的表的连接视图中选择ROWID或采样   网上搜了下,有多种原因和解决方法,最终我选择先尝试一下修改 ...

  8. Tips7:Unity中 Scene视图 和 Game视图 中 视角(Camera)的控制

    选中你要改变的相机,然后点击GameObject-->Align With View 选项(快捷键Ctrl+Shift+F)使相机视角和当前Sence视图中一样 通过这样可以控制在Game视图( ...

  9. MVC,如何在视图中声明方法,调用方法?

    <div> <!--在视图中申明方法,此方法的类型已经固定为HelperResult--> @helper ShowHello(string s) { <div> ...

随机推荐

  1. SharePoint 学习快速导航

    根据我的学习过程,会不断的增加一些学习的快速链接 . 入门篇 SharePoint入门链接,针对刚刚开始了解SharePoint 的朋友,我也是处在入门的状态,随后会慢慢的累积增加 安装 | 部署 | ...

  2. UVa 1599 Ideal Path【BFS】

    题意:给出n个点,m条边,每条边上涂有一个颜色,求从节点1到节点n的最短路径,如果最短路径有多条,要求经过的边上的颜色的字典序最小 紫书的思路:第一次从终点bfs,求出各个节点到终点的最短距离, 第二 ...

  3. null, undefined理解

    概述 null与undefined都可以表示"没有",含义非常相似.将一个变量赋值为undefined或null,语法效果几乎没区别. var a = undefined; // ...

  4. vue单页面前端做非空校验

    form表单 确定按钮 js部分 确定按钮的方法

  5. 2014 CodingTrip - 携程编程大赛 (预赛第二场)

    1001: 食物链(poj1182),直接贴代码,稍作可过 并查集 // // main.cpp // 携程1 // // Created by zhang on 14-4-11. // Copyri ...

  6. 云服务器 ECS Linux 系统下使用 dig 命令查询域名解析

    云服务器 ECS Linux 系统可以使用通常自带的 dig 命令来查询域名解析情况.本文对此进行简要说明. 查询域名 A 记录 命令格式: dig <域名> 比如,查询域名 www.al ...

  7. JAVA并发--volatile

    学过计算机组成原理的一定知道,为了解决内存速度跟不上CPU速度这个问题,在CPU的设计中加入了缓存机制,缓存的速度介于CPU和主存之间.在进行运算的时候,CPU将需要的数据映射一份在缓存中,然后直接操 ...

  8. thinkphp5内置标签

    thinkphp5内置标签 知道内置标签怎么用,查手册的时候好查 却功能的时候在里面找着来用 内置标签一览 内置标签 变量输出使用普通标签就足够了,但是要完成其他的控制.循环和判断功能,就需要借助模板 ...

  9. linux 不常用命令及命令组合

    lsof:list open files, sudo lsof | grep deleted:则列出虽然被删除,但还处于打开状态的文件.注意,这些文件占用的空间,只有在这些文件关闭时,才会被释放. m ...

  10. 关于Hive在主节点上与不在主节点上搭建的区别之谈

    Hive不在主节点上搭建,我这里是在HadoopSlave1上.