gpt4 book ai didi

sql - 使用 VIEW 进行 SELECT 操作可以提高性能吗?

转载 作者:行者123 更新时间:2023-12-01 08:20:53 24 4
gpt4 key购买 nike

致力于提高决策中心的性能,我们发现的瓶颈之一是数据库。

所以我想知道,oracle 是否为它的 View 编译了一个执行计划?

让我们假设我有一个定义的查询正在使用 10000请求期间的次数。
查询类似于:

select A, B, C 
from aTbl, bTbl left join cTbl on bTbl.cTblID = cTbl.objectkey
where aTbl.objectkey = bTbl.parentkey

在代码中,我想使用附加过滤参数获取上述查询的结果,例如: WHERE aTbl.flag1 = <<NUMBER>>
现在我有两个选择:
  • 使用上述 SQL 创建准备好的语句,然后重用该对象。
  • 把上面的select (aTbl, bTbl, cTbl)VIEW ,然后在此 View 上创建一个准备好的语句,从而受益于预编译 b Oracle 的执行计划。

  • 你有什么建议?

    最佳答案

    Oracle如果它认为它会改进计划,则可以将谓词插入 View 。

    如果您想避免这种情况,您可以使用以下任一方法:

  • 添加 /*+ NO_MERGE *//*+ NO_PUSH_PRED */提示进入 View 定义
  • 添加 /*+ NO_MERGE (view) *//*+ NO_PUSH_PRED (view) */提示使用该 View 的查询。

  • 如果你想强制这样做,请使用他们的合作伙伴 /*+ PUSH_PRED *//*+ MERGE */
    就性能而言,使用定义的 View (当然,如果它不是 MATERIALIZED VIEW)或内联 View (即子查询)没有区别。
    Oracle编译计划不是为了 View ,而是为了精确 SQL文本。

    也就是说,对于以下语句:
    SELECT A, B, C 
    FROM aTbl, bTbl
    LEFT JOIN cTbl ON
    bTbl.cTblID = cTbl.objectkey
    WHERE aTbl.objectkey = bTbl.parentkey
    AND aTbl.flag1 = :NUMBER

    SELECT *
    FROM
    (
    SELECT A, B, C, flag1
    FROM aTbl, bTbl
    LEFT JOIN cTbl ON
    bTbl.cTblID = cTbl.objectkey
    WHERE aTbl.objectkey = bTbl.parentkey
    )
    WHERE flag1 = :NUMBER

    /*
    CREATE VIEW v_abc AS
    SELECT A, B, C, flag1
    FROM aTbl, bTbl
    LEFT JOIN cTbl ON
    bTbl.cTblID = cTbl.objectkey
    WHERE aTbl.objectkey = bTbl.parentkey
    */

    SELECT A, B, C
    FROM v_abc
    WHERE flag1 = :NUMBER

    该计划将:
  • 是一样的(如果 Oracle 会选择压入谓词,这很有可能);
  • 第一次调用时被编译;
  • 再次调用时可以重用。
  • 关于sql - 使用 VIEW 进行 SELECT 操作可以提高性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/590669/

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