首页 > 解决方案 > Oracle 视图中的过滤器设置

问题描述

我有 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 子句的“基本视图”查询花费了一半的时间。

标签: oracleddlsql-view

解决方案


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

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

现在想象你把所有的水果都放在篮子里。抓住所有的橙子变得很容易,因为您确切地知道它们在哪里。

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

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


推荐阅读