我们正面临生产中的性能问题。 Mv referh程序运行了很长时间,差不多13到14个小时。
在MV referh程序中试图引用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';
发货表包含数百万条记录,而上述查询正在尝试提取近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年的范围,则比以前的查询更糟糕。
任何改善表现的建议。
请帮忙
答案 0 :(得分:1)
我将该标量子查询拉出到常规外连接中。
标量子查询的成本核算可以是ManyConnectorsExample,并且你强迫它进行大量单记录查找(可能是通过索引),而不是给它其他选项。
"主查询在选择列表中有一个标量子查询。
因此,Oracle在计划表中显示了两个独立的计划。一个用于驱动查询 - 成本为2,一个用于标量子查询,每次执行时的成本为2083.但是Oracle并不“知道”标量子查询将运行多少次(即使在很多情况下它可以预测最坏情况),并且不会在执行总成本时为其执行任何成本补贴。查询。"