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