2012-04-06 65 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