在谓词推送中,优化器将包含在查询块中的相关谓词推送到视图查询块中。对于不能合并的视图,这种技术可以提高不能合并视图的执行计划。数据库可以使用推送谓词来访问索引或作为过滤。
例如,假设创建了一个hr.contract_workers表:

SQL> drop table contract_workers;
Table dropped.
SQL> create table contract_workers as (select * from employees where 1=2);
Table created.
SQL> insert into contract_workers values (306, 'bill', 'jones', 'bjones','555.555.2000', '07-jun-02', 'ac_account', 8300, 0,205, 110);
1 row created.
SQL> insert into contract_workers values (406, 'jill', 'ashworth', 'jashworth','555.999.8181', '09-jun-05', 'ac_account', 8300, 0,205, 50);
1 row created.
SQL> insert into contract_workers values (506, 'marcie', 'lunsford', 'mlunsford','555.888.2233', '22-jul-01', 'ac_account', 8300, 0,205, 110);
1 row created.
SQL> commit;
Commit complete.
SQL> create index contract_workers_index on contract_workers(department_id);
Index created.

创建一个视图引用employees与contract_workers表。视图使用了union集合操作:

SQL> create view all_employees_vw as2  select employee_id, last_name, job_id, commission_pct, department_id3  from employees 4  union5  select employee_id, last_name, job_id, commission_pct, department_id6  from contract_workers;
View created.

然后对视图执行查询:

select last_name from all_employees_vw where department_id = 50;

因为视图是一个union集合操作查询,优化器不能合并视图的查询到主查询块。优化器可以通过推送谓词来转换查询,where子句条件department_id=50,会推送到视图的union集合操作查询中,转换后的等价查询如下:

select last_name
from (
select employee_id, last_name, job_id, commission_pct, department_id
from employees
where department_id=50
union
select employee_id, last_name, job_id, commission_pct, department_id
from contract_workers
where department_id=50 );

转换后的查询现在可以考虑对每个查询块使用索引或全表扫描,查询视图语句的执行计划如下:

SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced allstats last runstats_last peeked_binds'));
SQL_ID  265ccrp674n30, child number 0
-------------------------------------
select last_name from all_employees_vw where department_id = 50
Plan hash value: 1422200799
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation            | Name             | Starts | E-Rows |E-Bytes|E-Temp | Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                  |      1 |        |       |       |  1018 (100)|          |    100K|00:00:01.37 |     955 |    942 |       |       |          |
|   1 |  VIEW                | ALL_EMPLOYEES_VW |      1 |    100K|  2637K|       |  1018   (1)| 00:00:01 |    100K|00:00:01.37 |     955 |    942 |       |       |          |
|   2 |   SORT UNIQUE        |                  |      1 |    100K|  2540K|  3936K|  1018   (1)| 00:00:01 |    100K|00:00:01.18 |     955 |    942 |  8416K|  1135K| 7480K (0)|
|   3 |    UNION-ALL         |                  |      1 |        |       |       |            |          |    100K|00:00:00.76 |     955 |    942 |       |       |          |
|*  4 |     TABLE ACCESS FULL| EMPLOYEES        |      1 |    100K|  2540K|       |   273   (1)| 00:00:01 |    100K|00:00:00.41 |     948 |    942 |       |       |          |
|*  5 |     TABLE ACCESS FULL| CONTRACT_WORKERS |      1 |      1 |    60 |       |     2   (0)| 00:00:01 |      1 |00:00:00.01 |       7 |      0 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------1 - SET$1 / ALL_EMPLOYEES_VW@SEL$12 - SET$14 - SEL$2 / EMPLOYEES@SEL$25 - SEL$3 / CONTRACT_WORKERS@SEL$3
Outline Data
-------------/*+BEGIN_OUTLINE_DATAIGNORE_OPTIM_EMBEDDED_HINTSOPTIMIZER_FEATURES_ENABLE('12.2.0.1')DB_VERSION('12.2.0.1')ALL_ROWSNO_PARALLELOUTLINE_LEAF(@"SEL$2")OUTLINE_LEAF(@"SEL$3")OUTLINE_LEAF(@"SET$1")OUTLINE_LEAF(@"SEL$1")NO_ACCESS(@"SEL$1" "ALL_EMPLOYEES_VW"@"SEL$1")FULL(@"SEL$3" "CONTRACT_WORKERS"@"SEL$3")FULL(@"SEL$2" "EMPLOYEES"@"SEL$2")END_OUTLINE_DATA*/
Predicate Information (identified by operation id):
---------------------------------------------------4 - filter("DEPARTMENT_ID"=50)5 - filter("DEPARTMENT_ID"=50)

从执行计划的Predicate Information部分可以看到4,5操作使用了department_id=50来分别对表employees和contract_workers来进行过滤,也证明了可以将谓词推送到了视图中的查询块。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26015009/viewspace-2216495/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26015009/viewspace-2216495/

Oracle 12CR2查询转换之谓词推送相关推荐

  1. Oracle 12CR2查询转换之视图合并

    这里的测试数据库版本为12.2.0.1,在视图合并中,优化器代表视图的查询块到包含视国的查询块中.视图合并通过让优化器考虑额外的连接顺序,访问方法与其它转换来提高性能.例如,在一个视图被合并后并且在一 ...

  2. oracle 临时表子查询,Oracle 12CR2查询转换教程之临时表转换详解

    前言 大家都知道在12CR2中出现一种新的查询转换技术临时表转换, 在下面的例子中,数据库对customers表上的子查询结果物化到一个临时表中: SQL> show parameter sta ...

  3. Oracle 12CR2查询转换之临时表转换

    在12CR2中出现一种新的查询转换技术临时表转换, 在下面的例子中,数据库对customers表上的子查询结果物化到一个临时表中: SQL> show parameter star_transf ...

  4. Oracle 12CR2查询转换之星型转换

    星型转换是一种优化转换它用来避免对星型方案中的事实表进行全表扫描.一个星型方案将数据分成事实与维度表.事实是对一个事件比如销售的测量通常是数字.维度是标识事实的分类,比如日期,位置与产品.一个事实表有 ...

  5. Oracle 12CR2查询转换之表扩展

    在表扩展中,对于读取一个分区表部分数据时优化器会生成使用索引的执行计划.基于索引执行计划可以提高性能,但索引维护会增加开锁.在许多数据库中,DML只影响小部分数据.对于频繁更新的表表扩展使用基于索引的 ...

  6. 群晖安装Calibre(含格式转换豆瓣元数据推送kindle)221211

    群晖安装Calibre-web(格式转换&豆瓣元数据&推送kindle)221211测试可用 结论&效果 Calibre是什么 教程 一.本文安装Calibre的条件 二.选择 ...

  7. 金蝶云星空与旺店通·旗舰奇门对接集成销售订单查询连通原始单推送(KD销售订单对接WDT原始订单(线下)-ok)

    接入系统:金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台.金蝶K/3Cloud围绕着"生态.人人.体验&quo ...

  8. cursor is oracle 日期_Oracle 12CR2查询转换之cursor-duration临时表

    在Oracle12C中为了物化查询的中间结果,Oracle数据库在查询编译时在内存中可能会隐式的创建一个cursor_duration临时表. Cursor-Duration临时表的作用 复杂查询有时 ...

  9. [一键CV] Blazor 拖放上传文件转换格式并推送到浏览器下载

    前言 昨天有个小伙伴发了一个老外java编写的小工具给我,功能是转换西班牙邮局快递Coreeos express的单据格式成Amazon格式,他的需求是改一下程序为匹配转换另一个快递公司MRW格式到A ...

最新文章

  1. [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.20
  2. STM32H7的Cache和MPU
  3. 导致溢出_由整数类型溢出导致的英雄联盟峡谷惨案
  4. 关于数据库的备份和某个表的数据备份的相关步骤介绍
  5. lightgbm的GPU版本和CPU版本运行速度比较
  6. chrome调试js的小技巧
  7. 域服务器怎么修改管理员密码,域服务器更改客户端管理员的密码
  8. Linux磁盘及文件系统(二)Linux下磁盘命名和分区
  9. java HashMap的keyset方法
  10. Linux命令大全搜索网站模板
  11. Power BI Embedded 开发国内版-21V-版本实测
  12. 安全基础知识 最强0到33600端口详解
  13. 马克思主义基本原理概论复习资料
  14. win10增加图片查看器
  15. 优酷 Android 包瘦身治理思路全解
  16. laravel 分页 + 分页的样式
  17. pygame小项目 ~ 3 :Python完成简易飞机大战
  18. 阿里2021年面经汇总
  19. docker 使用tar安装mysql_使用docker安装mysql服务
  20. 【Excel VBA和Python对照学习】创建字典

热门文章

  1. 自动驾驶系统设计的那些底层软件开发中的重点解读
  2. 五一节,送给自己快乐
  3. 计算机启动到一半就重新启动怎么办,电脑开机过程中自动重启怎么解决
  4. 案例_IBM人力资源分析(上篇)
  5. 90 数字三角形(Triangle)
  6. linux下FTP服务启动与关闭命令
  7. 如何用WordPress+SRS做直播网站
  8. 基于51单片机的火灾报警系统温度烟雾浓度阈值报警proteus仿真原理图PCB
  9. Git客户端Sourcetree工具安装使用详解命令
  10. 服务器被如下ip攻击,如何根据ip超找攻击来源