【问题标题】:Filter settings in Oracle ViewsOracle 视图中的过滤器设置
【发布时间】:2018-04-24 17:07:42
【问题描述】:

我有 2 个这样的视图(简化):

CREATE VIEW BASE_VIEW AS
(
      -- Simplified version, view actually does a lot more.
      SELECT * FROM MYTABLE;
);

CREATE VIEW OUTER_VIEW AS
(
      -- The where clause here makes this view return half the rows as the above BASE_VIEW
      SELECT * FROM BASE_VIEW where SomeField = 'something'
);

我的问题是,OUTER_VIEW 的执行时间不应该是 BASE_VIEW 的大约一半吗?我看不到这种行为。执行 BASE_VIEW 几乎需要全部时间。

由于 Oracle 将引用的视图编译到您的外部视图中,我认为它足够智能,可以根据外部视图的 where 类优化查询。不应该吗?

编辑:事实上,带有来自“外部视图”的 where 子句的“基本视图”查询花费了一半的时间。

【问题讨论】:

  • 您正在处理多少行?您有权访问查询计划吗?它是索引表吗?该列是否被索引?
  • 注意窗口函数将导致第一个视图在应用过滤器之前运行,但您似乎没有使用任何提示

标签: oracle ddl sql-view


【解决方案1】:

想象一下,你有一整个房间,里面到处都是不同种类的水果。视图 BASE_VIEW 就像在说:“取回这个房间里的所有水果。”

OUTER_VIEW 就像在说:“取回这个房间里的所有橙子。”如果没有以某种方式订购水果,您将花费与 BASE_VIEW 大致相同的时间来搜索所有橙子。

现在想象一下,您将所有水果分开装在篮子里。抓住所有的橙子变得很容易,因为您确切地知道它们在哪里。

在 SomeField 上添加索引是对数据进行排序的原因,这样它就不必搜索整个水果房间。对于索引何时可以提供帮助存在一些限制。根据表中的行数,oracle 优化器可能会决定无论如何只抓取所有行会更快。我建议您通读本指南以确定索引表的正确方法:Use The Index, Luke。在开始编制索引时,它帮助了我很多。

如果 SomeField 不是直接来自 MYTABLE 并且只是 BASE_VIEW 中创建的字段,那么索引创建 SomeField 的字段可能会有所帮助。不看数据我们很难知道。

【讨论】:

  • Patrick,感谢您的 cmets,但查询和表优化已经全部完成。事实上,使用 where 子句运行“基本”查询需要一半的时间!
猜你喜欢
  • 2020-12-15
  • 2011-04-06
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多