Какой запрос быстрее выполнить - PullRequest
0 голосов
/ 28 февраля 2020

Ниже приведены два варианта запроса данных CTE и NFSE. Просьба сообщить!

Подобный подход, возможно, придется использовать во многих местах.

Я хотел бы, чтобы вы проверили их и предложили, если есть лучшие варианты.

Вариант 1: Запрос CTE со всеми необходимыми объединениями UNION с запросом на NFSe со всеми необходимыми объединениями

SELECT DISTINCT 'CTE' as docTypeID
   , cte.isqn_mstr_cd as ctePk
   , cte.ct_e_cd
   , cter.stat_desc
   , awb.CREATE_DT
   , awb.AWB_NBR
   , awb.SHPR_NM
   , awbs.DEST_LOC_CD
   , nfe.NT_FSCL_CD
   , nfe.FSCL_DOC_NBR
FROM cte_identity_master cte
  INNER JOIN cte_response_detail cter ON (cte.isqn_mstr_cd = cter.isqn_mstr_cd)
  LEFT JOIN match_ref_awb mawb ON (cte.isqn_ref_cd = mawb.isqn_mstr_cd)
  LEFT JOIN awb_cust_master awb ON (mawb.awb_nbr = awb.awb_nbr)
  LEFT JOIN awb_shipment_detail awbs ON (awb.awb_nbr = awbs.awb_nbr)
  LEFT JOIN match_ref_nfe mnfe ON (cte.isqn_ref_cd = mnfe.isqn_mstr_cd)
  LEFT JOIN nfe_identity_master nfe ON (mnfe.nt_fscl_cd = nfe.nt_fscl_cd)
UNION
SELECT DISTINCT 'NFSE' as docTypeID
   , nfse.isqn_mstr_cd as nfsePk
   , nfse.rp_s_id
   , nfser.stat_desc
   , awb.CREATE_DT
   , awb.AWB_NBR
   , awb.SHPR_NM
   , awbs.DEST_LOC_CD
   , nfe.NT_FSCL_CD
   , nfe.FSCL_DOC_NBR
FROM nfse_request_detail nfse
  INNER JOIN nfse_response_detail nfser ON (nfse.isqn_mstr_cd = nfser.isqn_mstr_cd)
  LEFT JOIN match_ref_awb mawb ON (nfse.isqn_ref_cd = mawb.isqn_mstr_cd)
  LEFT JOIN awb_cust_master awb ON (mawb.awb_nbr = awb.awb_nbr)
  LEFT JOIN awb_shipment_detail awbs ON (awb.awb_nbr = awbs.awb_nbr)
  LEFT JOIN match_ref_nfe mnfe ON (nfse.isqn_ref_cd = mnfe.isqn_mstr_cd)
  LEFT JOIN nfe_identity_master nfe ON (mnfe.nt_fscl_cd = nfe.nt_fscl_cd)
;

Вариант 2: Сначала используйте объединение CTe и NFSe, а затем применяйте объединения с другими таблицами

SELECT ctnf.* 
   , awb.CREATE_DT
   , awb.AWB_NBR
   , awb.SHPR_NM
   , awbs.DEST_LOC_CD
   , nfe.NT_FSCL_CD
   , nfe.FSCL_DOC_NBR
FROM (
SELECT DISTINCT 'CTE' as docTypeID
   , cte.isqn_mstr_cd as docPk
   , cte.ct_e_cd as docNbr
   , cter.stat_desc as docStat
   , cte.isqn_ref_cd as matchRef
FROM cte_identity_master cte
  INNER JOIN cte_response_detail cter ON (cte.isqn_mstr_cd = cter.isqn_mstr_cd)
UNION
SELECT DISTINCT 'NFSE' as docTypeID
   , nfse.isqn_mstr_cd as nfsePk
   , nfse.rp_s_id
   , nfser.stat_desc
   , nfse.isqn_ref_cd
FROM nfse_request_detail nfse
  INNER JOIN nfse_response_detail nfser ON (nfse.isqn_mstr_cd = nfser.isqn_mstr_cd)
) ctnf
  LEFT JOIN match_ref_awb mawb ON (ctnf.matchRef = mawb.isqn_mstr_cd)
  LEFT JOIN awb_cust_master awb ON (mawb.awb_nbr = awb.awb_nbr)
  LEFT JOIN awb_shipment_detail awbs ON (awb.awb_nbr = awbs.awb_nbr)
  LEFT JOIN match_ref_nfe mnfe ON (ctnf.matchRef = mnfe.isqn_mstr_cd)
  LEFT JOIN nfe_identity_master nfe ON (mnfe.nt_fscl_cd = nfe.nt_fscl_cd)
        ;

Оба подхода, описанных выше, будут иметь следующий Where пункт:

WHERE lower(cte.sttn_cd) = lower(:stationId) 
and (:documentType is null or lower(:documentType) = 'cte') 
and (:shipperName is null or lower(awb.shipperNm) like lower(concat(concat('%',:shipperName),'%'))) 
  and (:awbCreated is null or to_char(awb.createDt, 'MM-DD-YYYY') = :awbCreated) 
  and (:awbNumber is null or m2.awbNbr like concat(concat('%',:awbNumber),'%')) 
  and (:serviceType = 0 or awbs.baseServiceCd = :serviceType) 
  and (:commitmentDate is null or awbs.commitmentDate = :commitmentDate) 
  and (:ursa is null or lower(awbs.ursaCd) like lower(concat(concat('%',:ursa),'%'))) 
  and (:destLocationId is null or lower(awbs.destLocCd) like lower(concat(concat('%',:destLocationId),'%'))) 
  and (:nfeNumber is null or nfe.fiscalDocumentNumber like concat(concat('%',:nfeNumber),'%')) 

ПОЖАЛУЙСТА, ПРЕДЛОЖЕНИЕ - Вывод этих двух подходов для получения данных, который будет лучше исправить в Java Конец для извлечения данных ,

Любая помощь будет принята с благодарностью. Также предложите, если есть какой-либо другой лучший запрос, кроме этих двух!

...