无法优化SQL查询。花费巨大。 Oracle应用程序

时间:2016-04-05 07:11:05

标签: sql oracle optimization oracle10g po

这是一个查询,我必须根据Oracle 11i中某些条件提取收据作为转换的一部分。

- >一个重要的检查是检查待机发票。我只需要提取发票处于暂停状态的详细信息。检查的条件是

在AP_HOLDS_ALL表格中 - 1)发票应该存在                          2)发布查找代码应为NULL                          3)状态标志应为S或NULL                          4)AP_HOLDS_ALL表中不应存在具有相同发票ID且发布查找代码为空的任何行。

我已尝试并在以下最后一个查询中添加了以下条件,但它获取的行非常慢(一天中有100 000条记录)。

如何改善表现?

    select * -- multiple Columns
    from rcv_shipment_headers  rsh,
   rcv_shipment_lines    rsl,
   rcv_transactions      rt,
   hr_operating_units    hou,
   po_headers_all        poh,
   po_lines_all          pol,
   po_line_locations_all pll,
   po_distributions_all  pda,
   po_vendors            pv,
   po_vendor_sites_all   pvs
    where 1 = 1
and rsh.shipment_header_id = rsl.shipment_header_id
and rsh.shipment_header_id = rt.shipment_header_id
and rsl.shipment_line_id = rt.shipment_line_id
and rt.po_header_id = poh.po_header_id
and rt.po_line_id = pol.po_line_id
and rt.po_line_location_id = pll.line_location_id
and rt.po_distribution_id = pda.po_distribution_id
and poh.po_header_id = pol.po_header_id
and pol.po_line_id = pll.po_line_id
and pll.line_location_id = pda.line_location_id
and poh.org_id = hou.organization_id
and poh.type_lookup_code = 'STANDARD'
and poh.authorization_status = 'APPROVED'
and poh.approved_flag = 'Y'
and rsh.ship_to_org_id = pll.ship_to_organization_id
and rt.organization_id = pll.ship_to_organization_id
and pol.org_id = hou.organization_id
and pll.org_id = hou.organization_id
and pda.org_id = hou.organization_id
and hou.date_to is null
and (rt.transaction_type = 'DELIVER' or rt.transaction_type = 'RECEIVE')
and rt.vendor_site_id = pvs.vendor_site_id
and rt.vendor_id = pv.vendor_id
and pv.vendor_id = pvs.vendor_id
and (nvl(pda.quantity_ordered, 0) - nvl(pda.quantity_cancelled, 0)) > 0
and nvl(pda.quantity_delivered, 0) > 0
and nvl(pda.quantity_billed, 0) > 0
and nvl(rsl.quantity_received, 0) > 0
and ((nvl(pda.quantity_delivered, 0) = nvl(pda.quantity_billed, 0)) or
    (nvl(pda.quantity_delivered, 0) > nvl(pda.quantity_billed, 0)) or
   (nvl(pda.quantity_delivered, 0) < nvl(pda.quantity_billed, 0)))

and exists
 (select aida.po_distribution_id
      from ap_invoices_all aia, ap_invoice_distributions_all aida
     where aia.cancelled_date is null
       and aida.po_distribution_id = pda.po_distribution_id
       and exists
     (select c.invoice_id
              from ap_holds_all c
             where c.release_lookup_code is null
               and c.invoice_id = aia.invoice_id
               and c.org_id = nvl(p_leg_operating_unit, c.org_id)
               and (c.status_flag = 'S' or c.status_flag is null)
               and not exists
             (select 1
                      from ap_holds_all d
                     where d.invoice_id = c.invoice_id
                       and d.org_id = nvl(p_leg_operating_unit, d.org_id)
                       and d.release_lookup_code is not null))
         and aia.org_id = nvl(p_leg_operating_unit, aia.org_id)
         and aia.invoice_id = aida.invoice_id)
   and poh.org_id = nvl(p_leg_operating_unit, poh.org_id)
  • p_leg_operating_unit是一个具有NULL值的参数,因为我试图获取所有OU的值

**最后存在导致问题。

1 个答案:

答案 0 :(得分:-3)

尝试以下方法,可以解决您的问题:

  1. / * + parallel(4)* / --hint。如果不起作用,那就试试吧 平行(8)/并行(16)。
  2. 重新排序连接。根据返回的最少行数加入表。例如表A,B,C。加入&amp; b返回100 行,但B&amp; c返回20行。然后首先加入B&amp; C表和加入 与A.
  3. 如果优化程序无法访问索引,请使用/ * + Index *提示。