簡體   English   中英

sql 的 UNION 子句性能問題

[英]UNION clause performance issue with sql

我有以下聯合子句導致整個存儲過程運行非常緩慢。 我正在使用 union 從同一個表中收集信息,但第二個和第三個 union 子句也連接到其他表以進行過濾。 我知道這可能不是最好的編碼方法,希望有人能指導我使用更好的語法。

select ss.int_tran_id 
from status ss 
where ss.stage in ('ACHPayment_Confirmed', 'HIFV4', 'HIFV5_FTRINF', 'Payment_HIFV5_FTRINF')
UNION
select ss.int_tran_id 
from status ss, references rf
where ss.int_tran_id = rf.int_tran_id
and ss.stage = 'PREVDAY'
and rf.mid_ref IS NOT NULL
UNION
select ss.int_tran_id 
from status ss, app_data ad, ach aa
where ss.int_tran_id = ad.int_tran_id
and ad.app_data_id = aa.ach_id
and ss.stage = 'PREVDAY'
and aa.par_number IS NOT NULL

我認為您可以將其重寫為狀態表上的單個查詢,使用 OR 來測試每個場景,如下所示:

SELECT ss.int_tran_id
FROM   status SS
WHERE  ss.stage in ('ACHPayment_Confirmed', 'HIFV4', 'HIFV5_FTRINF', 'Payment_HIFV5_FTRINF')
OR     (ss.stage = 'PREVDAY'
        AND (EXISTS (SELECT NULL
                     FROM   references rf
                     WHERE  ss.int_tran_id = rf.int_tran_id
                     AND    rf.mid_ref IS NOT NULL)
             OR EXISTS (SELECT NULL
                        FROM   app_data ad
                               INNER JOIN ach aa
                                 ON (ad.app_data_id = aa.ach_id)
                        WHERE  ss.int_tran_id = ad.int_tran_id
                        AND    aa.par_number IS NOT NULL)));

考慮在一個 SELECT 中編寫整個查詢(使用括號、AND、OR),這消除了 UNION 的所有低效重復檢查。

您可以像 Pawel-Dyl 建議的那樣嘗試 UNION ALL,但如果您可以做到這一點,您可能可以在一個 SELECT 中全部編寫,這為優化器提供了更多選項。

我的變種:

select ss.int_tran_id 
from status ss
left join references rf on (ss.stage = 'PREVDAY'
                            and ss.int_tran_id = rf.int_tran_id
                            and rf.mid_ref IS NOT NULL)
left join app_data ad on (ss.stage = 'PREVDAY'
                          and ss.int_tran_id = ad.int_tran_id)
left join ach aa on (ss.stage = 'PREVDAY'
                     and ad.app_data_id = aa.ach_id
                     and aa.par_number IS NOT NULL)
where ss.stage in ('ACHPayment_Confirmed', 'HIFV4', 'HIFV5_FTRINF', 'Payment_HIFV5_FTRINF')
   or rf.int_tran_id is not null
   or aa.ach_id is not null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM