oracle - 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 子句的“基本视图”查询花费了一半的时间。
解决方案
想象一下,你有一整个房间,里面到处都是不同种类的水果。视图 BASE_VIEW 就像在说:“取回这个房间里的所有水果。”
OUTER_VIEW 就像在说:“取回这个房间里的所有橙子。” 如果没有以某种方式订购水果,您将花费与 BASE_VIEW 大致相同的时间来搜索所有橙子。
现在想象你把所有的水果都放在篮子里。抓住所有的橙子变得很容易,因为您确切地知道它们在哪里。
在 SomeField 上添加索引是对数据进行排序的原因,这样它就不必搜索整个水果房间。对于索引何时可以提供帮助存在一些限制。根据表中的行数,oracle 优化器可能会决定无论如何只抓取所有行会更快。我建议您通读本指南以确定索引表的正确方法:使用索引,卢克。在开始建立索引时,它帮助了我很多。
如果 SomeField 不是直接来自 MYTABLE 并且只是在 BASE_VIEW 中创建的字段,那么对创建 SomeField 的字段进行索引可能会有所帮助。我们很难不看数据就知道。
推荐阅读
- android - 如何等待在 onResume() 开始的异步任务完成,同时允许用户单击依赖于它的按钮?
- python - 检测弓形非流形几何的算法
- javascript - 切换按钮上的背景颜色(keydown / keycodes)
- http - Http操作,管道模式,url,
- testing - 每次测试后用玩笑重置 Redux 存储
- java - 带有 BrowserMobProxy 的 Selenium ReomteWebDriver 提供空的 HarEntries
- plot - plot_tree 不返回 class_names
- unity3d - 我的 AddForce 方法不起作用或推动 Rigidbody2D
- macros - 如何将宏参数传递给同一宏中的表达式?
- c++ - 当在标头中声明的函数是自定义定义时,C++ 中的未定义符号