2012-04-06 63 views
0

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

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; 

回答

1

假设你是正确的,而大多数的时间被消耗在执行两个功能xf_ar_chargesxf_ar_pymts(注意,这是在暗示它是外WHERE条款所创造的逻辑蕴涵性能问题)提高性能的两种最可能的方法是优化这些过程背后的代码或将逻辑移出这些过程并将其嵌入到SQL语句本身中。如果不知道更多关于数据和代码的信息,很难说出哪些更有可能提高性能或如何优化功能(当然,任何人都不可能确认它确实是导致性能问题的外部WHERE子句)。

+0

那么,如果我将两个函数的计算移动到内部select中,查询大约需要一分钟。所以这就是为什么我认为它是where子句中的两个函数。感谢您的帮助 – Dan 2012-04-06 19:08:52

+0

函数“xf_a​​r_charges”和“xf_a​​r_pymts”是确定性的吗?这可能是因为数据库反复做同样的工作。 – 2012-04-09 13:51:58