如何提高基于视图的查询性能?
Posted
技术标签:
【中文标题】如何提高基于视图的查询性能?【英文标题】:how to improve the performance of query based on view? 【发布时间】:2014-01-22 20:46:55 【问题描述】:我是调优的新手,我正在努力学习,因为 Oracle 就像一片海洋。 我有一个基于运行时间更长的视图的查询。我有这样的查询:
select t2.col1,t2.col2
from vw_tab1 t1,vw_tab1 t2,tab3 t3
where t1.col3=123
and t2.col3<>123
and t2.col4=t1.col5
AND t3.col2=t2.col2;
我们在同一个查询中多次使用单个视图。这是否在视图中运行查询两次?建议非常感谢。我在 Oracle 11g 单实例数据库中运行此查询。
【问题讨论】:
您似乎正在交叉加入t3
,因为也没有指向另一个的链接。使用join
语法会更清晰。
@Alex Poole,还有一个与 t3 的连接,例如 t3.col2=t2.col2。同样使用 Join 语法不会获得更好的性能,对吧?
在您的声明文本中,您说您多次使用一个视图。在您发布的查询中,您使用的是不同的视图。如果您也省略了连接,请编辑您的问题以添加它们。使用 SQL 99 语法不应该改变性能,除非它可以帮助您识别您省略了一些连接条件的事实。对于任何调优请求,包括查询计划在内的信息都会非常有帮助,例如每个对象中有多少行、各种谓词的选择性等信息。
我已更改查询。但我的主要问题是,当我运行此查询时,它是否会多次运行视图,因为视图不是存储数据的表?
具有别名 t3 的表未与任何其他表连接 - 它是笛卡尔积...
【参考方案1】:
是的,构成视图 vw_tab1 的表将被查询两次,每个实例一次( t1 和 t2 )。如果您要发布语句的解释计划,您应该看到 oracle 查询构成视图的表,而不是实际视图。
【讨论】:
以上是关于如何提高基于视图的查询性能?的主要内容,如果未能解决你的问题,请参考以下文章