0

我有一个查询将被放入一个过程中,它将创建一个 id 报告。我的查询的WHERE子句(不是内部视图中的子句)是长时间运行的原因。这个查询需要大约twelve minutes,我想知道你们是否有任何缩短运行时间的技巧。或者,即使balance = 0在过程的 pl/sql 代码中,而不是在查询中,也可以不显示记录/行。

SELECT x.arp_person_id AS student_id,
   xf_ar_charges(x.arp_person_id, '2008FL') as charges,
   xf_ar_pymts(x.arp_person_id,'2008FL') as payment,
   (xf_ar_charges(x.arp_person_id, '2008FL') 
                                    - (xf_ar_pymts(x.arp_person_id,'2008FL')) AS balance
  FROM (select distinct arp_person_id 
          from ar_payments
          WHERE arp_fa_transmittal IS NOT NULL
   AND ('N' = 'N' OR arp_date BETWEEN TO_DATE('11/01/2008','MM/DD/YYYY')
   AND TO_DATE('12/31/2008','MM/DD/YYYY')) 
   AND ('Y' = 'N' OR arp_term IN ('2008FL', 'N')) ) x 
  WHERE (xf_ar_charges(x.arp_person_id, '2008FL') 
                                         - (xf_ar_pymts(x.arp_person_id,'2008FL')) != 0;
4

1 回答 1

1

假设您是正确的,并且大部分时间都花在执行这两个函数上xf_ar_charges,并且xf_ar_pymts(请注意,这是造成性能问题的外部子句暗示的逻辑含义WHERE)这两种最有可能的方法提高性能的方法是优化这些过程背后的代码,或者将逻辑移出这些过程并将其嵌入到 SQL 语句本身中。在不了解您的数据和代码的情况下,很难建议其中哪些更有可能提高性能或如何优化功能(当然,任何人都无法确认它确实是WHERE导致性能问题的 外部子句)。

于 2012-04-06T19:06:14.023 回答