简体   繁体   English

查询真的很慢

[英]Really slow query

I am looking for some advice in relation to a query we run each week.我正在寻找与我们每周运行的查询有关的一些建议。 The query takes far too long to return all rows (approx 16000) and takes roughly 1 hour.查询返回所有行(大约 16000 行)的时间太长,大约需要 1 小时。 When you initially run the query, the 50 rows are brought back in a few mins, but if you press CTRL-A to fetch all rows, this is where it takes too much time.当您最初运行查询时,50 行会在几分钟内返回,但如果您按 CTRL-A 来获取所有行,这将花费太多时间。 Is there anything in the query below i can amend to run faster?下面的查询中有什么我可以修改以运行得更快吗? Thanks谢谢

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
)

Based on my experience, subqueries could be deadly performance-wise, especially if you are dealing with a large amount of data.根据我的经验,子查询在性能方面可能是致命的,尤其是在处理大量数据时。 If the problem could not be handled by joining tables, I would advise pre-defining the subqueries within a WITH statement and then referring to those instead.如果无法通过连接表来解决问题,我建议在 WITH 语句中预定义子查询,然后引用它们。 It will significantly increase your querying speed, trust me.相信我,它将显着提高您的查询速度。 You can define multiple queries inside one WITH statement.您可以在一个 WITH 语句中定义多个查询。 More details on using the WITH statement here有关在此处使用 WITH 语句的更多详细信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM