Sql Oracle视图的性能

Sql Oracle视图的性能,sql,oracle,performance,views,Sql,Oracle,Performance,Views,运行Oracle视图时如何提高性能? 我有一个Oracle视图,它看起来像这样: SELECT ... FROM myview p WHERE p.param1 = 'x' AND p.param2 = 'y' AND p.param3 = 'z' 视图的代码为(类似): myview with condition的运行时间约为13-14秒。 当我让运行带有条件的查询时: SELECT a.param1, b.param2, c.param3 FROM atab a J

运行Oracle视图时如何提高性能? 我有一个Oracle视图,它看起来像这样:

SELECT ...
FROM   myview p
WHERE  p.param1 = 'x' AND p.param2 = 'y' AND p.param3 = 'z'
视图的代码为(类似):

myview with condition的运行时间约为13-14秒。 当我让运行带有条件的查询时:

SELECT a.param1, b.param2, c.param3
FROM   atab a
       JOIN btab b
           ON a.id = b.blaid
       JOIN ctab c
           ON b.id = c.blaid
WHERE  a.param1 = 'x' AND b.param2 = 'y' AND b.param3 = 'z'
运行时间约为0.3秒

我理解这一点,因此Oracle首先获取myview的所有数据,然后应用过滤器。但我不是很确定。 如果我直接运行查询,Oracle可以选择只获取实际需要的数据(因为在执行过程中,可以立即考虑条件)。但在这里我也不是很确定

问题是,当视图具有复杂的结构且其存在是合理的时,如何解决性能问题

我考虑一个解决方案,例如一个带参数的函数。可以使用where条件立即执行查询


还有其他可能的解决方案吗?

< P>只要表中的数据不经常改变,或者如果你能接受某种“旧”数据返回,你可以考虑使用A,它被存储在磁盘上而不是纯逻辑的。 编辑

另一个选项是创建参数化视图,如中所述

我理解这一点,因此Oracle首先获取myview的所有数据,然后 在此之后,应用过滤器


那是不对的。您可以比较两个查询的执行计划:使用过滤器直接从表中查询和使用过滤器从视图中查询。它应该是平等的。你的结果是关于缓存的。要提高性能,请尝试更频繁地使用索引和收集统计数据。如果数据由句点或其他标记分隔,您可以使用分区选项。

查询的性能由执行计划驱动。如果以“本机”或作为视图运行相同的查询,很可能执行计划相同,性能也相同。
添加WHERE子句后查询运行更快的原因是您正在筛选数据;因此,需要检索和加入的日期更少。

偶尔这可能是一个解决方案。在这种特殊情况下,这是否是一种解决办法,我们必须加以研究。但是,当出现这样的问题时,最好知道我们通常如何使用Oracle视图。因为这样的情况肯定不是罕见的。我用另一个选项编辑了我的答案。我看到,这些解决方案使用带有DBMS_SESSION.SET_上下文的准全局(key,value…这不是我真正要搜索的。对不起!我也这么认为!问题是如何解决这个问题。我的同事编辑了查询,所以现在两种情况下的执行时间都很短。因此,在修改查询之前,Oracle(使用联接和where子句)使用优化器处理了整个语句。此Oracle优化查询速度太快,而不是查询本身。在视图中,Oracle无法应用其优化器,因为表联接和条件彼此分离。Oracle优化器的此项工作现在已完成,通过更改查询,这将导致两个变量都被删除正如其他人所指出的,您的理解是不正确的。获取每个查询的执行计划并将其发布到您的问题中。若要获取执行计划,请运行查询,然后运行select*from table(dbms\u xplan.display\u cursor(null,null,'TYPICAL');
SELECT a.param1, b.param2, c.param3
FROM   atab a
       JOIN btab b
           ON a.id = b.blaid
       JOIN ctab c
           ON b.id = c.blaid
WHERE  a.param1 = 'x' AND b.param2 = 'y' AND b.param3 = 'z'