【问题标题】:Performance by Oracle viewsOracle 视图的性能
【发布时间】:2017-07-28 20:21:03
【问题描述】:

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

SELECT ...
FROM   myview p
WHERE  p.param1 = 'x' AND p.param2 = 'y' AND p.param3 = 'z'

视图的代码是(类似地):

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

myview 有条件的运行时间约为 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 条件立即执行查询。

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

【问题讨论】:

    标签: sql oracle performance views


    【解决方案1】:

    只要表中的数据不经常更改,或者如果您可以接受以某种方式返回“旧”数据,则可以考虑使用materialized view,它存储在磁盘上而不是纯粹的逻辑.

    编辑

    另一种选择是创建参数化视图,如 this question 中所述

    【讨论】:

    • 偶尔这可能是一个解决方案。在这种特殊情况下,它是否可以成为一个解决方案,我们将不得不进行检查。但是,当出现此类问题时,最好知道我们通常如何使用 Oracle 视图。因为这样的情况肯定不是罕见的
    • 用另一个选项编辑了我的答案
    • 我明白了,这些解决方案使用带有 DBMS_SESSION.SET_CONTEXT(key, value...
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      查询的性能由执行计划驱动。如果“本机”或作为视图运行相同的查询,则执行计划很可能相同并且性能相同。 添加 WHERE 子句后查询运行速度更快的原因是您正在过滤数据;这样需要检索和加入的日期就更少了。

      【讨论】:

      • 我也这么认为!问题是如何解决这个问题。我的同事已经编辑了查询,所以现在这两种情况的执行时间都很短。因此,在修改查询之前,Oracle(使用连接和 where 子句)使用其优化器处理了整个语句。这个 Oracle 优化的查询非常快,而不是查询本身。在视图中,Oracle 无法应用其优化器,因为表连接和条件是相互分离的。 Oracle-optimizer 的这项工作现在已经完成了我的同事,通过更改查询,这导致两种变体都一样快。
      • @peter70 正如其他人所指出的,您的理解是不正确的。获取每个查询的执行计划并将其发布在您的问题中。要获取执行计划,请运行查询,然后运行 ​​select * from table(dbms_xplan.display_cursor(null, null, 'TYPICAL'));
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 2023-02-03
      • 1970-01-01
      • 2014-11-23
      • 2011-02-15
      • 1970-01-01
      相关资源
      最近更新 更多