查询非常慢。由于联盟ALL,问题是“由其他会话读取”

时间:2019-07-13 16:29:42

标签: sql database oracle query-performance union-all

我有以下查询。下面的查询具有两次工会。因此,查询正在等待相同的资源,并且等待时间过长。下面是sql trace的输出。

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       1        0.00          0.00
  Disk file operations I/O                     1047        0.00          0.15
  db file sequential read                    167048        0.64       1584.33
  db file parallel read                         216        0.05          1.37
  read by other session                      520944        0.71       5113.10
  latch: cache buffers chains                 31768        0.00          1.32
  db file scattered read                         50        0.01          0.14
  wait list latch free                            1        0.00          0.00

您可以看到read by other session参数。反正有什么可以做下面的查询,以便可以减少这个时间?

 SELECT 
 mmt . transaction_date Txn_date ,  
   GCC.SEGMENT1||'
'||GCC.SEGMENT2||'
'||GCC.SEGMENT3||'
'||GCC.SEGMENT4||'
'||GCC.SEGMENT5||'
'||GCC.SEGMENT6 C_acct_flex1 , 
 MSI.SEGMENT1 C_item_flex1 , 
 msi . description Description , 
 mtt.transaction_type_name Type ,
 mmt . transaction_source_type_id Type_id , 
 mmt . organization_id Org_id , 
 DECODE ( mmt . transaction_source_type_id ,
           1 , to_char ( mmt . transaction_source_id ) ,
           2 ,  MKTS.SEGMENT1||''||MKTS.SEGMENT2||''||MKTS.SEGMENT3 ,
           3 ,  GL.SEGMENT1||''||GL.SEGMENT2||''||GL.SEGMENT3||''||GL.SEGMENT4||''||GL.SEGMENT5||''||GL.SEGMENT6 , 
           5 , to_char ( mmt . transaction_source_id ) , 
           6 ,  MDSP.SEGMENT1 , 
           7 , to_char ( mmt . transaction_source_id ) ,
           8 ,  MKTS.SEGMENT1||''||MKTS.SEGMENT2||''||MKTS.SEGMENT3 ,
           9 , to_char ( mmt . transaction_source_id ) , 
           10 , to_char ( mmt . transaction_source_id ) , 
           11 , to_char ( mmt . transaction_source_id ) ,
           12 ,  MKTS.SEGMENT1||''||MKTS.SEGMENT2||''||MKTS.SEGMENT3 , mmt . transaction_source_name ) 
Source , 
decode ( cal . accounted_dr ,
          NULL , - 1 * ABS ( mmt . primary_quantity ) , ABS ( mmt . primary_quantity ) ) Quantity , 
msi . primary_uom_code Primary_uom , 
round ( cal . rate_or_amount * : P_EXCHANGE_RATE , : cp_ext_precision ) Cost ,
 nvl ( nvl ( cal . accounted_dr , - 1 * cal . accounted_cr ) , 0 ) * : P_EXCHANGE_RATE Value , 
 cal . ae_line_id 

FROM 

cst_ae_headers cah ,
 mtl_material_transactions mmt  , 
 mtl_item_categories mic , 
 mtl_system_items msi ,
 MTL_SALES_ORDERS mkts ,
 MTL_GENERIC_DISPOSITIONS mdsp ,
 gl_code_combinations gl  ,
 mtl_transaction_types mtt ,
 cst_ae_lines cal , 
 gl_code_combinations gcc
 WHERE 
 cah . ae_header_id = cal . ae_header_id AND 
 cah . accounting_event_id = mmt . transaction_id AND 
 cah . acct_event_source_table = 'MMT' AND 
 cal . code_combination_id = gcc . code_combination_id AND 
 mmt . inventory_item_id = msi . inventory_item_id AND
 mmt . organization_id = msi . organization_id AND
 mmt . organization_id = nvl ( mmt . owning_organization_id , mmt . organization_id ) AND 
 nvl ( mmt . owning_tp_type , 2 ) = 2 AND 
 cah . cost_group_id = : P_cost_group_id AND
 cah . cost_type_id = : P_cost_type_id AND 
 cah . period_id = : P_period_id AND  
 GCC.SEGMENT1 = '0731' AND 
 GCC.SEGMENT2 BETWEEN '75000' AND '95999' AND 
 GCC.SEGMENT3 BETWEEN '00000' AND '99999' AND 
 GCC.SEGMENT4 BETWEEN '00000' AND '99999' AND 
 GCC.SEGMENT5 = '0000' AND 
 GCC.SEGMENT6 = '00000' AND  1 = 1 AND  1 = 1  AND
 mmt.transaction_type_id = mtt.transaction_type_id AND 
 mmt.inventory_item_id = mic.inventory_item_id AND 
 mmt.organization_id = mic.organization_id AND
 mic.category_set_id = 1    AND 
 ( mmt . transaction_source_type_id = : P_source_type_id OR : P_source_type_id IS NULL ) AND 
 ( mmt . transaction_type_id = : P_txn_type_id OR : P_txn_type_id IS NULL ) AND 
 mmt . transaction_source_id = mkts . sales_order_id (+) AND 
 mmt . transaction_source_id = mdsp . disposition_id (+) AND
 mmt . transaction_source_id = gl . code_combination_id (+)

 UNION ALL 

 SELECT 
 rt . transaction_date Txn_date , 
   GCC.SEGMENT1||'
'||GCC.SEGMENT2||'
'||GCC.SEGMENT3||'
'||GCC.SEGMENT4||'
'||GCC.SEGMENT5||'
'||GCC.SEGMENT6 C_acct_flex1 ,  
  MSI.SEGMENT1 C_item_flex1 ,
  msi . description Description , 
  rt.transaction_type Type ,
  0 Type_id ,
  0 Org_id ,
  null Source ,
  decode ( rt . po_distribution_id , 
          NULL , decode ( cal . accounted_dr , NULL , - 1 * ABS ( rt . primary_quantity ) , 
          ABS ( rt . primary_quantity ) ) * POD . QUANTITY_ORDERED / POLL . QUANTITY , decode ( cal . accounted_dr , NULL , - 1 * ABS ( rt . primary_quantity ) , ABS ( rt . primary_quantity ) ) ) Quantity , msi . primary_uom_code Primary_uom , round ( cal . rate_or_amount * : P_EXCHANGE_RATE , : cp_ext_precision ) Cost , nvl ( nvl ( cal . accounted_dr , - 1 * cal . accounted_cr ) , 0 ) * : P_EXCHANGE_RATE Value , cal . ae_line_id 

FROM

 cst_ae_headers cah , 
 cst_ae_lines cal ,
 mtl_system_items_vl msi , 
 rcv_transactions rt ,
 rcv_shipment_lines rsl , 
 gl_code_combinations gcc ,
 po_distributions_all pod , 
 po_line_locations_all poll  ,
 mtl_item_categories mic
 WHERE
 pod . line_location_id = poll . line_location_id and
 poll . line_location_id = rt . po_line_location_id and 
 pod . po_distribution_id = nvl ( rt . po_distribution_id , pod . po_distribution_id ) and
 pod . po_distribution_id = cal . po_distribution_id and 
 cah . ae_header_id = cal . ae_header_id AND 
 cah . accounting_event_id = rt . transaction_id AND
 cah . acct_event_source_table = 'RT' AND 
 cal . code_combination_id = gcc . code_combination_id AND
 rt . shipment_line_id = rsl . shipment_line_id AND
 NVL ( rt . consigned_flag , 'N' ) = 'N' AND 
 rsl . item_id = msi . inventory_item_id (+) AND 
 cah . organization_id = msi . organization_id AND 
 cah . cost_group_id = : P_cost_group_id AND 
 cah . cost_type_id = : P_cost_type_id AND 
 cah . period_id = : P_period_id AND
 GCC.SEGMENT1 = '0731' AND 
 GCC.SEGMENT2 BETWEEN '75000' AND '95999' AND 
 GCC.SEGMENT3 BETWEEN '00000' AND '99999' AND
 GCC.SEGMENT4 BETWEEN '00000' AND '99999' AND 
 GCC.SEGMENT5 = '0000' AND 
 GCC.SEGMENT6 = '00000' AND  1 = 1 AND  1 = 1 AND 
 rsl.item_id = mic.inventory_item_id
          AND cah.organization_id = mic.organization_id 
          AND mic.category_set_id  = 1    and 1 = 1 

UNION ALL 

SELECT rae . transaction_date Txn_date ,  GCC.SEGMENT1||'
'||GCC.SEGMENT2||'
'||GCC.SEGMENT3||'
'||GCC.SEGMENT4||'
'||GCC.SEGMENT5||'
'||GCC.SEGMENT6 C_acct_flex1 , 
 MSI.SEGMENT1 C_item_flex1 , 
 msi . description Description , 
 decode ( : P_type_option ,
          1 , rt . source_document_code , decode ( rae . event_type_id , 18 , raet . description , 19 , raet . description , 20 , raet . description , raet . event_type_name ) ) Type ,
          0 Type_id , 0 Org_id , null Source , decode ( cal . accounted_dr , NULL , - 1 * ABS ( rae . primary_quantity ) , ABS ( rae . primary_quantity ) ) Quantity , 
msi . primary_uom_code Primary_uom ,
round ( cal . rate_or_amount * : P_EXCHANGE_RATE , : cp_ext_precision ) Cost , 
nvl ( nvl ( cal . accounted_dr , - 1 * cal . accounted_cr ) , 0 ) * : P_EXCHANGE_RATE Value ,
 cal . ae_line_id 


 FROM 
 cst_ae_headers cah ,
 cst_ae_lines cal , 
 mtl_system_items msi ,
 rcv_transactions rt , 
 rcv_accounting_events rae ,
 rcv_shipment_lines rsl ,
 gl_code_combinations gcc , 
 rcv_Accounting_event_types raet  ,
 mtl_item_categories mic 

 WHERE 
 cah . ae_header_id = cal . ae_header_id AND 
 cah . accounting_event_id = rae . accounting_event_id and 
 rae . rcv_transaction_id = rt . transaction_id AND 
 cah . acct_event_source_table = 'RAE' AND
 cal . code_combination_id = gcc . code_combination_id AND 
 rt . shipment_line_id = rsl . shipment_line_id AND 
 NVL ( rt . consigned_flag , 'N' ) = 'N' AND 
 rsl . item_id = msi . inventory_item_id (+) AND 
 cah . organization_id = msi . organization_id AND 
 cah . cost_group_id = : P_cost_group_id AND 
 cah . cost_type_id = : P_cost_type_id AND
 cah . period_id = : P_period_id AND
 raet . event_type_id = rae . event_type_id AND  
 GCC.SEGMENT1 = '0731' AND
 GCC.SEGMENT2 BETWEEN '75000' AND '95999' 
 AND GCC.SEGMENT3 BETWEEN '00000' AND '99999' 
 AND GCC.SEGMENT4 BETWEEN '00000' AND '99999' 
 AND GCC.SEGMENT5 = '0000' 
 AND GCC.SEGMENT6 = '00000' AND  1 = 1 AND  1 = 1 
 AND rsl.item_id = mic.inventory_item_id
 AND cah.organization_id = mic.organization_id 
 AND mic.category_set_id  = 1   
 ORDER BY 2 asc , 1 asc , 3 asc , 5 asc , 7 asc , 8 asc , 9 asc , 11 asc 

是否有优化上述查询的条件?甚至您的小建议也会很有帮助

0 个答案:

没有答案