gpt4 book ai didi

optimization - 提高 Oracle View 的性能

转载 作者:行者123 更新时间:2023-12-03 17:33:03 25 4
gpt4 key购买 nike

我有一个要保存为 View 的查询:

WITH subquery AS ( SELECT aaa_id, ... FROM table_aaa ... )
SELECT subquery.aaa_id, ... FROM table_bbb JOIN subquery USING ( ... )
;

[注意:在现实生活中,我的查询比这复杂得多,有几个 WITH子查询,许多执行 JOINS , 都是 JOIN一起编。但我正在寻找可以用来解决我的问题的一般指导。]

此查询的执行包括全表扫描。这是有道理的,因为 WHERE 中不包含任何标准。条款。但是,我可以通过包含这样一个子句来消除大多数全表扫描:
WITH subquery AS ( SELECT aaa_id, ... FROM table_aaa ... WHERE aaa_id = :id)
SELECT subquery.aaa_id, ... FROM table_bbb JOIN subquery USING ( ... )
;

但是,我似乎没有选择放置 WHERE创建 View 时在正确位置的条件:
CREATE OR REPLACE VIEW vw_my_view AS
WITH subquery AS ( SELECT aaa_id, ... FROM table_aaa ... )
SELECT subquery.aaa_id, ... FROM table_bbb JOIN subquery USING ( ... )
;

SELECT ... FROM vw_my_view WHERE aaa_id = :id
;

在这种情况下,执行计划仍然包含全表扫描。有没有办法让我暗示 WHERE子句实际上可以插入 WITH子查询?

最佳答案

我有过类似的经历,虽然我没有通用的解决方案,但我建议如下:

  • 运行“SELECT * FROM v$parameter2;”并确保 _complex_view_merging 已打开。在与它相关的早期 10g 版本之一中存在一个令人讨厌的错误,因此一些 dbas 将其关闭,并且可能在修复后忘记将其重新打开。
  • 将所有关于提示的考虑作为最后的措施。根据我的经验,它们对于防止全表扫描很少有用,因为优化器已经尽其所能避免它们。
  • 如果您有一个基表,其主键是您最终要过滤 View 的内容,请尝试进行设置,以便您的 View 的主查询以该表开头,然后加入您复杂的 with 子句查询,即使那join 是完全多余的(即让 oracle 有机会在加入复杂位之前对该基表进行简单的过滤)。确保将要过滤 View 的列是直接从该基表中选择的,而不是从 complex_query 中选择的。所以像

  • .
         with (complicated_query)
    select base_table.key1, complicated_query.*
    from base_table
    join complicated_query on base_table.key1 = complicated_query.key1;
  • 如果您有使用不相关子查询的过滤器,请尝试将它们切换为相关等价物(反之亦然)。
  • 在 FROM 子句中使用连接语句的顺序和/或从哪个表开始,即使从逻辑上讲它不会对结果产生影响。这是一个有点绝望的策略,但通过这样做,我确实让执行计划变得更好。优化 Oracle 查询并不总是一个合理的过程。
  • 关于optimization - 提高 Oracle View 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14838114/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com