暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle “排序” 在视图内或视图外,给出相同的执行计划和结果

askTom 2017-02-23
553

问题描述

=
-- v_product视图定义
创建或替换视图v_product
选择 <<列名>>
从t_product
按col_1,col_2排序;

-- 下面是生产多年以来运行的现有代码。
-此查询用于获取结果并将其写入外部csv文件中。
选择 <<列名>>
从v_product-> 这是上面显示的数据库视图。在这个视图中已经有Order by子句。
其中active_prod = 'Y'
和 <<其他列过滤器>>;
=

现在的要求是在写入csv文件之前用两个新列对结果集进行排序。
问题是:
在哪里放置按顺序条款?

1)。根据您的其他一些线程,我在最外面的查询中输入了 “order by”。

-- 用于将其写入csv文件的最终查询。
选择 <<列名>>
从v_product-> 在这个视图中已经有Order by子句。
其中active_prod = 'Y'
和 <<其他列过滤器>>
按new_column_3排序,new_column_4 DESC; -> 此处添加顺序。

-
| Id | 操作 | 名称 | 行 | 字节 | TempSpc | 成本 (% CPU)| 时间 |
-
| 0 | SELECT语句 | | 65M | 9325M | | 2288K (1)| 00:04:36 |
| 1 | 排序顺序 | | 65M | 9325M | 12G | 2288K (1)| 00:04:36 |
| 2 | 表访问完全 | WC_I110 | 65M | 9325M | | 127K (2)| 00:00:16 |
-

2)。我已经在视图本身 (这不是最外面的查询) 中添加了这两个新闻列,仍然给出了相同的执行计划和结果。

-使用新的order by子句修改的视图定义。
创建或替换视图v_product
选择 <<列名>>
从t_product
按col_1,col_2订购
new_column_3,new_column_4 DESC; --> 这部分是新添加的。

-不修改最终查询。仍然给出相同的结果。
选择 <<列名>>
从v_product-> 这是数据库视图。在这个视图中已经有Order by子句。
其中active_prod = 'Y'
和 <<其他列过滤器>>;

-
| Id | 操作 | 名称 | 行 | 字节 | TempSpc | 成本 (% CPU)| 时间 |
-
| 0 | SELECT语句 | | 65M | 9325M | | 2288K (1)| 00:04:36 |
| 1 | 排序顺序 | | 65M | 9325M | 12G | 2288K (1)| 00:04:36 |
| 2 | 表访问完全 | WC_I110 | 65M | 9325M | | 127K (2)| 00:00:16 |
-

==> 您能否解释一下如何通过内部或外部视图进行排序来获得相同的执行计划和结果?

提前感谢您的帮助。

专家解答

这是因为我们很聪明 :-) 嗯... 不是那么多,但是优化器是。

在优化查询之前,它会经历一个称为 “转换” 的阶段,在这里我们寻找重写查询的方法,这可能会为优化提供更多选项,而不会改变SQL的意图。

这里有一个例子

SQL> create table t as select * From dba_objects;

Table created.

SQL>
SQL> create or replace view v as
  2  select * from t
  3  order by object_name, object_id, created;

View created.

SQL>
SQL> alter session set events = '10053 trace name context forever, level 1';

Session altered.

SQL> explain plan for select * from v;

Explained.

SQL> explain plan for select * from v order by owner;

Explained.

复制


“10053” 指示数据库转储优化器信息。您可以在定义中看到带有order-by的视图V,然后我查看了两个潜在的查询。

在10053的跟踪文件中,我们看到以下内容

Final query after transformations:******* UNPARSED QUERY IS *******
SELECT "V"."OWNER" "OWNER",
"V"."OBJECT_NAME" "OBJECT_NAME",
"V"."SUBOBJECT_NAME" "SUBOBJECT_NAME",
"V"."OBJECT_ID" "OBJECT_ID",
"V"."DATA_OBJECT_ID" 
"DATA_OBJECT_ID",
"V"."OBJECT_TYPE" "OBJECT_TYPE",
"V"."CREATED" "CREATED",
"V"."LAST_DDL_TIME" "LAST_DDL_TIME",
"V"."TIMESTAMP" "TIMESTAMP",
"V"."STATUS" "STATUS",
"V"."TEMPORARY" "TEMPORARY",
"V"."GENERATED" "GENERATED",
"V"."SECONDARY" "SECONDARY",
"V"."NAMESPACE" "NAMESPACE",
"V"."EDITION_NAME" "EDITION_NAME",
"V"."SHARING" "SHARING",
"V"."EDITIONABLE" "EDITIONABLE",
"V"."ORACLE_MAINTAINED" "ORACLE_MAINTAINED" 
FROM  (SELECT * /* MSQ_NON_UNPARSED_SELECT_LIST_FOR_VPD_VIEW */ 
       FROM MCDONAC."T" "T" WHERE 1=1 ORDER BY "T"."OBJECT_NAME","T"."OBJECT_ID", "T"."CREATED") "V"
       
       
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT "T"."OWNER" "OWNER",
"T"."OBJECT_NAME" "OBJECT_NAME",
"T"."SUBOBJECT_NAME" "SUBOBJECT_NAME",
"T"."OBJECT_ID" "OBJECT_ID",
"T"."DATA_OBJECT_ID" "DATA_OBJECT_ID",
"T"."OBJECT_TYPE" "OBJECT_TYPE",
"T"."CREATED" "CREATED",
"T"."LAST_DDL_TIME" "LAST_DDL_TIME",
"T"."TIMESTAMP" "TIMESTAMP",
"T"."STATUS" "STATUS",
"T"."TEMPORARY" "TEMPORARY",
"T"."GENERATED" "GENERATED",
"T"."SECONDARY" "SECONDARY",
"T"."NAMESPACE" "NAMESPACE",
"T"."EDITION_NAME" "EDITION_NAME",
"T"."SHARING" "SHARING",
"T"."EDITIONABLE" "EDITIONABLE",
"T"."ORACLE_MAINTAINED" "ORACLE_MAINTAINED" 
FROM MCDONAC."T" "T" 
WHERE 1=1 ORDER BY "T"."OWNER"

复制


在第一个示例中,我们简单地按照定义的顺序运行视图。通过第二个示例,优化器检测到基于视图定义进行排序没有好处,因为我们将要在外部查询中覆盖它。所以查询被转换以反映这一点。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论