表与视图的性能

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 并不是什么大好处

【讨论】:

以上是关于表与视图的性能的主要内容,如果未能解决你的问题,请参考以下文章

将规范化表与非规范化索引视图一起使用是个好主意吗?

Polybase 外部表与 OPENROWSET 无服务器 sql 池架构

Mysql 临时表+视图

mysql视图学习总结(转)

动态性能视图

ElasticsearchMeltdown对Elasticsearch性能的影响