过滤Oracle视图中的设置

时间:2018-04-24 17:07:43

标签: oracle ddl sql-view

我有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'
);

我的问题是,不应该像BASE_VIEW那样在大约一半的时间内执行OUTER_VIEW吗?我没有看到这种行为。它几乎需要执行BASE_VIEW所需的全部时间。

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

编辑:事实上"基本观点"使用"外部视图"中的where子句进行查询花了一半的时间。

1 个答案:

答案 0 :(得分:0)

想象一下,整个房间里到处都是各种各样的水果。视图BASE_VIEW就像在说,"检索这个房间里的所有水果。"

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

现在想象你把所有的水果都分成了篮子。抓住所有的橘子变得容易,因为你确切地知道它们的位置。

在SomeField上添加索引是对数据进行排序的原因,因此它不必搜索整个水果室。索引何时可以提供帮助有一些限制。根据表中的行数,oracle优化器可能会认为最好只抓取所有行。我建议你仔细阅读本指南,以确定索引表的正确方法:Use The Index, Luke。开始编制索引时,它帮助了我很多。

如果SomeField不是直接来自MYTABLE并且只是BASE_VIEW中的已创建字段,则可能有助于索引创建SomeField的字段。没有看到数据,我们很难知道。