设为首页 收藏本站
查看: 1224|回复: 0

[经验分享] Oracle技术之Oracle查询重写对全外连接无效(一)

[复制链接]

尚未签到

发表于 2018-9-25 13:40:16 | 显示全部楼层 |阅读模式
  测试发现,Oracle不支持全外连接的查询重写,即使物化视图和查询语句完全匹配。
  在10g中测试发现对于全外连接,创建语句一致的物化视图也无法利用查询重新功能:
  [oracle@yans1 ~]$ sqlplus test/test

  SQL*Plus:>  Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.
  Connected to:

  Oracle Database10gEnterprise Edition>  With the Partitioning, OLAP and Data Mining options
  SQL> SET PAGES 100 LINES 120
  SQL> SHOW PARAMETER QUERY
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  query_rewrite_enabled                string      TRUE
  query_rewrite_integrity              string      enforced
  SQL> CREATE MATERIALIZED VIEW MV_T1_FULL_JOIN_T2
  2  ENABLE QUERY REWRITE AS

  3  SELECT T1.ID>  4  FROM T1 FULL OUTER JOIN T2
  5  ON T1.ID = T2.ID;
  Materialized view created.
  SQL> SET AUTOT ON

  SQL> SELECT T1.ID>  2  FROM T1 FULL OUTER JOIN T2
  3  ON T1.ID = T2.ID;

  >  ---------- ----------
  2          2
  3          3
  4          4
  5          5
  6          6
  7          7
  8          8
  1
  0
  10
  9
  11 rows selected.
  Execution Plan
  ----------------------------------------------------------
  Plan hash value: 2841162349
  -----------------------------------------------------------------------------

  |>  -----------------------------------------------------------------------------
  |   0 | SELECT STATEMENT     |      |    10 |   260 |    13   (8)| 00:00:01 |
  |   1 |  VIEW                |      |    10 |   260 |    13   (8)| 00:00:01 |
  |   2 |   UNION-ALL          |      |       |       |            |          |
  |*  3 |    HASH JOIN OUTER   |      |     9 |   234 |     7  (15)| 00:00:01 |
  |   4 |     TABLE ACCESS FULL| T1   |     9 |   117 |     3   (0)| 00:00:01 |
  |   5 |     TABLE ACCESS FULL| T2   |     9 |   117 |     3   (0)| 00:00:01 |
  |*  6 |    HASH JOIN ANTI    |      |     1 |    26 |     7  (15)| 00:00:01 |
  |   7 |     TABLE ACCESS FULL| T2   |     9 |   117 |     3   (0)| 00:00:01 |
  |   8 |     TABLE ACCESS FULL| T1   |     9 |   117 |     3   (0)| 00:00:01 |
  -----------------------------------------------------------------------------

  Predicate Information (identified by operation>  ---------------------------------------------------
  3 - access("T1"."ID"="T2"."ID"(+))
  6 - access("T1"."ID"="T2"."ID")
  Note
  -----
  - dynamic sampling used for this statement
  Statistics
  ----------------------------------------------------------
  1551  recursive calls
  0  db block gets
  427  consistent gets
  10  physical reads

  0  redo>  720  bytes sent via SQL*Net to client
  492  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  47  sorts (memory)
  0  sorts (disk)
  11  rows processed

  SQL> SELECT /*+ REWRITE(MV_T1_FULL_JOIN_T2) */ T1.ID>  2  FROM T1 FULL OUTER JOIN T2
  3  ON T1.ID = T2.ID;

  >  ---------- ----------
  2          2
  3          3
  4          4
  5          5
  6          6
  7          7
  8          8
  1
  0
  10
  9
  11 rows selected.
  Execution Plan
  ----------------------------------------------------------
  Plan hash value: 2841162349
  -----------------------------------------------------------------------------

  |>  -----------------------------------------------------------------------------
  |   0 | SELECT STATEMENT     |      |    10 |   260 |    13   (8)| 00:00:01 |
  |   1 |  VIEW                |      |    10 |   260 |    13   (8)| 00:00:01 |
  |   2 |   UNION-ALL          |      |       |       |            |          |
  |*  3 |    HASH JOIN OUTER   |      |     9 |   234 |     7  (15)| 00:00:01 |
  |   4 |     TABLE ACCESS FULL| T1   |     9 |   117 |     3   (0)| 00:00:01 |
  |   5 |     TABLE ACCESS FULL| T2   |     9 |   117 |     3   (0)| 00:00:01 |
  |*  6 |    HASH JOIN ANTI    |      |     1 |    26 |     7  (15)| 00:00:01 |
  |   7 |     TABLE ACCESS FULL| T2   |     9 |   117 |     3   (0)| 00:00:01 |
  |   8 |     TABLE ACCESS FULL| T1   |     9 |   117 |     3   (0)| 00:00:01 |
  -----------------------------------------------------------------------------

  Predicate Information (identified by operation>  ---------------------------------------------------
  3 - access("T1"."ID"="T2"."ID"(+))
  6 - access("T1"."ID"="T2"."ID")
  Note
  -----
  - dynamic sampling used for this statement
  Statistics
  ----------------------------------------------------------
  13  recursive calls
  0  db block gets
  61  consistent gets
  0  physical reads

  0  redo>  720  bytes sent via SQL*Net to client
  492  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  4  sorts (memory)
  0  sorts (disk)
  11  rows processed
  同样在11g中存在同样的问题,创建REWRITE_TABLE,检查无法查询重写的原因:
  SQL> @?/rdbms/admin/utlxrw
  表已创建。
  SQL> begin
  2  dbms_mview.explain_rewrite('SELECT T1.ID, T2.ID
  3  FROM T1 FULL OUTER JOIN T2
  4  ON T1.ID = T2.ID');
  5  end;
  6  /
  PL/SQL过程已成功完成。
  SQL> select MESSAGE from REWRITE_TABLE;
  MESSAGE
  -------------------------------------------------------------------------------------------
  QSM-01150:未重写查询
  QSM-01219:未找到合适的实体化视图来重写此查询
  QSM-01263:如果查询引用了字典表或视图,则无法执行查询重写
  根据表中的信息查询metalink,虽然找到类似的bug,但是这个bug在11gr2中已经被修正,而当前的sql在11gr2中依然存在。看来又是一个隐藏的bug。
  oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-602031-1-1.html 上篇帖子: ORACLE 日期转换 下篇帖子: Oracle客户端的配置(配置Oracle本地命名服务)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表