【发布时间】:2011-06-29 17:05:53
【问题描述】:
最近开始使用数据库,其中约定是为每个表创建一个视图。如果您假设表和视图之间存在一对一的映射,我想知道是否有人可以告诉我这样做对性能的影响。顺便说一句,这是在 Oracle 上。
【问题讨论】:
最近开始使用数据库,其中约定是为每个表创建一个视图。如果您假设表和视图之间存在一对一的映射,我想知道是否有人可以告诉我这样做对性能的影响。顺便说一句,这是在 Oracle 上。
【问题讨论】:
假设问题是关于非物化视图的——实际上取决于视图所基于的查询,以及正在对其执行的操作。有时,优化器可以将谓词推送到视图查询中。如果不是,那么它就不如桌子本身那么好。视图是建立在表格之上的——您为什么期望性能会更好?
分层视图(在另一个视图之上构建一个视图)是一种不好的做法,因为您在运行时才知道问题。分层视图发生谓词推送的可能性也较小。
视图也可以是可更新的——如果有人对基础表具有 INSERT/UPDATE/DELETE 权限,它们就不是限制对资源的访问的可靠方法。
物化视图与表格一样好,但众所周知的限制是它们支持的内容。
【讨论】:
EXPLAIN PLAN 是确定设置情况的关键。
你没有在视图中解释你在做什么?与表格的 1:1 听起来您使用的视图更像是同义词而不是视图。 IOW,是 views = "SELECT * FROM table",那么除了硬解析之外,您不会看到任何性能损失。
如果您要加入其他表或在其中放置过滤器子句以防止谓词推送,那么您一定会在某个时候看到重大打击。
【讨论】:
我对视图的唯一痛苦是通过数据库链接进行分布式查询。本地优化器获取有关远程对象的一些详细信息,但视图不会告诉它任何索引,因此您可以获得一些古怪的计划。
我听说有些地方将其用作标准,因为他们可以轻松地“重新排序”视图中的列。在我看来,YMMV 并不是什么大好处
【讨论】: