真的很慢查询

时间:2020-02-11 11:52:27

标签: sql oracle performance

我正在寻找有关每周运行的查询的一些建议。该查询花费的时间太长,无法返回所有行(大约16000),大约需要1个小时。最初运行查询时,几分钟后会带回50行,但是如果您按CTRL-A来获取所有行,这将花费太多时间。我可以修改以下查询来加快运行速度吗?谢谢

SELECT
  Contract,
  Part_No,
  Description,
  Warehouse,
  Bay, 
  Location,
  HANDLING_UNIT_ID,
  Handling_Unit_API.Get_Alt_Handling_Unit_Label_Id(HANDLING_UNIT_ID) AS pallet_id,
  Lot_Batch_No,
  Qty,
  Uom,
  (Catch_Qty/1000) AS cATCH_QTY_T,
  Catch_Uom,
  Point_In_Time_Part_Cost AS Part_Cost,
  Qty * Point_In_Time_Part_Cost AS Value
  --Part_Value_Offset,
  --Qty * Point_In_Time_Part_Cost + Part_Value_Offset AS Expected_GL_Balance
FROM
(
SELECT
  s.Contract,
  s.Part_No,
  s.Description,
  s.Warehouse,
  s.Bay,
  s.Location,
  s.HANDLING_UNIT_ID,
  Handling_Unit_API.Get_Alt_Handling_Unit_Label_Id(s.HANDLING_UNIT_ID) AS ALT_HND,
  s.Lot_Batch_No,
  s.Qty,
  s.Uom,
  s.Catch_Qty,
  s.Catch_Uom,
  FM_Inventory_Util_Api.Get_PIT_Part_Cost(Contract, Part_No, Warehouse, To_Date('&EFFECTIVE_DATE', 'DD/MM/YYYY')) AS Point_In_Time_Part_Cost
FROM
(
SELECT
  ip.Contract,
  ip.Part_No,
  ip.Description,
  ip.Warehouse,
  ip.Bay_No AS Bay, 
  ip.Location_No AS Location,
  ip.HANDLING_UNIT_ID,
  Handling_Unit_API.Get_Alt_Handling_Unit_Label_Id(ip.HANDLING_UNIT_ID) AS ALT_HND,
  ip.Lot_Batch_No,
  SUM(ip.Qty) AS Qty,
  MIN(ip.UOM) AS UOM,
  SUM(ip.Catch_Qty) AS Catch_Qty,
  MIN(ip.Catch_UOM) AS Catch_UOM
FROM
(
SELECT
  ipis.Contract, 
  ipis.Part_No, 
  Inventory_Part_Api.Get_Description(ipis.Contract, ipis.Part_No) AS Description,
  ipis.Warehouse, 
  ipis.Bay_No, 
  ipis.Location_No,
  ipis.HANDLING_UNIT_ID,
  IFSAPP.Handling_Unit_API.Get_Alt_Handling_Unit_Label_Id(ipis.HANDLING_UNIT_ID) AS ALT_HND,
  ipis.Lot_Batch_No,
  SUM(ipis.Qty_Onhand) AS Qty,
  MIN(Inventory_Part_API.Get_Unit_Meas(ipis.Contract, ipis.Part_No)) UOM, 
  SUM(ipis.Catch_Qty_Onhand) AS Catch_Qty,
  (SELECT unit_code
      FROM   PART_CATALOG_TAB
      WHERE  part_no = IPIS.part_no
      AND cATCH_UNIT_ENABLED = 'TRUE') AS CATCH_UOM
FROM
  Inventory_Part_In_Stock ipis
WHERE
  ipis.Contract LIKE Nvl('&SITE', '%')
AND  ipis.Warehouse LIKE Nvl('&WAREHOUSE', '%')
AND  (ipis.Bay_No LIKE Nvl('&BAY', '%') or ipis.Bay_No is null)

GROUP BY
  ipis.Contract, 
  ipis.Part_No, 
  Inventory_Part_Api.Get_Description(ipis.Contract, ipis.Part_No),
  ipis.Warehouse, 
  ipis.Bay_No, 
  ipis.Location_No,
  ipis.HANDLING_UNIT_ID,
  ifsapp.Handling_Unit_API.Get_Alt_Handling_Unit_Label_Id(ipis.HANDLING_UNIT_ID),
  ipis.Lot_Batch_No
HAVING 
  SUM(ipis.Qty_Onhand)  <> 0
UNION ALL
SELECT DISTINCT
  i.Contract, 
  i.Part_No,
  Inventory_Part_Api.Get_Description(i.Contract, i.Part_No) AS Description,
  Inventory_Location_API.Get_Warehouse(i.Contract, i.Location_No) AS Warehouse,
  Inventory_Location_API.Get_Bay_No(i.contract, i.location_no) AS Bay_No,
  i.Location_No,
  i.HANDLING_UNIT_ID,
  Handling_Unit_API.Get_Alt_Handling_Unit_Label_Id(i.HANDLING_UNIT_ID) AS ALT_HND,
  i.Lot_Batch_No,
  Nvl(SUM(Decode(i.Direction, '+', 0 - i.Quantity, i.Quantity)), 0) AS Qty,
  MIN(Inventory_Part_API.Get_Unit_Meas(i.Contract, i.Part_No)) UOM,
  Nvl(SUM(Decode(i.Catch_Direction, '+', 0 - i.Catch_Quantity, i.Catch_Quantity)), 0) AS Catch_Qty,
  (SELECT unit_code
      FROM   PART_CATALOG_TAB
      WHERE  part_no = i.part_no
      AND cATCH_UNIT_ENABLED = 'TRUE') AS CATCH_UOM
FROM
  Inventory_Transaction_Hist2 i
WHERE
  i.Contract LIKE Nvl('&SITE', '%')
AND
  i.Date_Applied BETWEEN To_Date('&EFFECTIVE_DATE', 'DD/MM/YYYY') + 1 AND Trunc(SYSDATE)
AND
  i.Direction IN ('+', '-')
AND
  Inventory_Location_API.Get_Warehouse(i.Contract, i.Location_No) LIKE Nvl('&WAREHOUSE', '%')
AND
  (Inventory_Location_API.Get_Bay_No(i.contract, i.location_no) LIKE Nvl('&BAY', '%') or 
   inventory_Location_API.Get_Bay_No(i.contract, i.location_no) is null)
GROUP BY
  i.Contract, 
  i.Part_No,
  Inventory_Part_Api.Get_Description(i.Contract, i.Part_No),
  Inventory_Location_API.Get_Warehouse(i.Contract, i.Location_No),
  Inventory_Location_API.Get_Bay_No(i.contract, i.location_no),
  i.Location_No,
  i.HANDLING_UNIT_ID,
  Handling_Unit_API.Get_Alt_Handling_Unit_Label_Id(i.HANDLING_UNIT_ID),
  i.Lot_Batch_No
HAVING 
  Nvl(SUM(Decode(i.Direction, '+', 0 - i.Quantity, i.Quantity)), 0)  <> 0
) ip
GROUP BY
  ip.Contract,
  ip.Part_No,
  ip.Description,
  ip.Warehouse,
  ip.Bay_No,
  ip.Location_No,
  ip.HANDLING_UNIT_ID,
  Handling_Unit_API.Get_Alt_Handling_Unit_Label_Id(ip.HANDLING_UNIT_ID),
  ip.Lot_Batch_No
HAVING
  SUM(ip.Qty) <> 0
) s
)

1 个答案:

答案 0 :(得分:0)

根据我的经验,子查询在性能上可能是致命的,尤其是当您处理大量数据时。 如果通过连接表无法解决问题,则建议在WITH语句中预定义子查询,然后再引用这些子查询。 相信我,它将大大提高您的查询速度。您可以在一个WITH语句中定义多个查询。 有关使用WITH语句here

的更多详细信息