Действительно медленный запрос - PullRequest
0 голосов
/ 11 февраля 2020

Я ищу совет относительно запроса, который мы выполняем каждую неделю. Запрос занимает слишком много времени, чтобы вернуть все строки (около 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 голосов
/ 12 февраля 2020

Исходя из моего опыта, подзапросы могут быть смертельно опасными с точки зрения производительности, особенно если вы имеете дело с большим количеством данных. Если проблема не может быть решена путем объединения таблиц, я бы посоветовал предварительно определить подзапросы в операторе WITH, а затем обратиться к ним. Поверьте, это значительно увеличит вашу скорость запросов. Вы можете определить несколько запросов внутри одного оператора WITH. Подробнее об использовании оператора WITH здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...