0

我们在生产中面临性能问题。mv referh 程序运行时间很长,差不多 13 到 14 个小时。

在 MV 中引用程序试图引用 5 个 MV。其中一个MV正在运行很长时间。

以下是长时间运行的 MV 脚本。

SELECT rcvt.transaction_id,
    rsh.shipment_num,
    rsh.shipped_date,
    rsh.expected_receipt_date,
    (select rcvt1.transaction_date from rcv_transactions rcvt1
    where rcvt1.po_line_id = rcvt.po_line_id
    AND rcvt1.transaction_type   = 'RETURN TO VENDOR'
    and rcvt1.parent_transaction_id=rcvt.transaction_id
    )transaction_date
  FROM rcv_transactions rcvt,
    rcv_shipment_headers rsh,
    rcv_shipment_lines rsl
  WHERE 1                     =1
  AND rcvt.shipment_header_id =rsl.shipment_header_id
  AND rcvt.shipment_line_id   =rsl.shipment_line_id
  AND rsl.shipment_header_id  =rsh.shipment_header_id
  AND rcvt.transaction_type   = 'RECEIVE';

Shipment 表包含数百万条记录,以上查询试图提取几乎 60% 到 70% 的数据。我们怀疑数据负载是原因。我们正在努力提高上述脚本的性能。所以我们添加了日期过滤器来限制数据。

SELECT rcvt.transaction_id,
    rsh.shipment_num,
    rsh.shipped_date,
    rsh.expected_receipt_date,
    (select rcvt1.transaction_date from rcv_transactions rcvt1
    where rcvt1.po_line_id = rcvt.po_line_id
    AND rcvt1.transaction_type   = 'RETURN TO VENDOR'
    and rcvt1.parent_transaction_id=rcvt.transaction_id
    )transaction_date
  FROM rcv_transactions rcvt,
    rcv_shipment_headers rsh,
    rcv_shipment_lines rsl
  WHERE 1                     =1
  AND rcvt.shipment_header_id =rsl.shipment_header_id
  AND rcvt.shipment_line_id   =rsl.shipment_line_id
  AND rsl.shipment_header_id  =rsh.shipment_header_id
  AND rcvt.transaction_type   = 'RECEIVE'
    AND TRUNC(rsh.creation_date)  >=  NVL(TRUNC((sysdate - profile_value),'MM'),TRUNC(rsh.creation_date) );

对于 1 年的配置文件,它显示出一些改进,但如果我们给出 2 年的范围,它比以前的查询更差。

任何提高性能的建议。

请帮忙

4

1 回答 1

1

我会将该标量子查询拉出到常规外部联接中。

标量子查询的成本计算可能很差,并且您正在强迫它进行大量单记录查找(可能是通过索引),而不是为其提供其他选项。

“然后主查询在选择列表中有一个标量子查询。

因此,Oracle 在计划表中显示了两个独立的计划。一个用于驱动查询 - 成本为 2,一个用于标量子查询,每次执行的成本为 2083。

但是 Oracle 不“知道”标量子查询将运行多少次(即使在许多情况下它可以预测最坏的情况),并且在查询的总成本中没有为它的执行提供任何成本补贴。 "

于 2016-08-17T00:37:12.103 回答