2016-02-28 60 views
-2

我有一個名爲FCT含2.5億條記錄,索引(dwh_key日期,結束日期),並在END_DATE(每日)分區表如何提高我的選擇性能

我有這樣的選擇:

SELECT FCT.ACCOUNT_NUMBER, 
     FCT.PRODUCT_CODE, 
     FCT.PRODUCT_START_DATE, 
     FCT.PRODUCT_END_DATE, 
     FCT.SVC_FEATURE_ATTRIBUTE, 
     FCT.SVC_FEATURE_ATTR_START_DATE, 
     FCT.END_DATE 
FROM 
FCT 
WHERE 
FCT.PRODUCT_CODE IN ($$prm1, 
         $$prm2, 
         $$prm3) 
OR 
(
FCT.END_DATE = TO_DATE('31/12/2999', 'DD/MM/YYYY') 
AND 
FCT.SVC_FEATURE_ATTRIBUTE in($$prm4, 
          $$prm5) 
) 

它大約需要20分鐘+。

我需要,使其更快..但想不到的東西,在這裏做..

+0

首先,將其拆分爲2個工會選擇 – cutzero

+2

是否使用您當前的索引?您是否檢查執行計劃 –

+0

您只提到一個索引:'(dwh_key,end_date)',但不要在查詢中爲'dwh_key'設置過濾條件。因此,除非'dwh_key'具有非常低的基數(在這種情況下它可能會執行'INDEX SKIP SCAN'),否則可能不會使用該索引。還有其他的索引嗎?如果是這樣,他們是本地分區還是全局分區索引? –

回答

2

數據庫通常都很難與OR條件優化。所以,儘量UNIONUNION ALL

SELECT . . . 
FROM FCT 
WHERE FCT.PRODUCT_CODE IN ($$prm1, $$prm2, $$prm3) 
UNION 
SELECT . . . 
FROM FCT 
WHERE FCT.END_DATE = TO_DATE('31/12/2999', 'DD/MM/YYYY') AND 
     FCT.SVC_FEATURE_ATTRIBUTE in ($$prm4, $$prm5); 

然後,您可以優化這些子查詢有兩個指標:FC(PRODUCT_CODE)FCT(END_DATE, SVC_FEATURE_ATTRIBUTE)。如果查詢返回大量的行,我會建議使用UNION ALL這樣的:

SELECT . . . 
FROM FCT 
WHERE FCT.PRODUCT_CODE IN ($$prm1, $$prm2, $$prm3) 
UNION ALL 
SELECT . . . 
FROM FCT 
WHERE FCT.END_DATE = TO_DATE('31/12/2999', 'DD/MM/YYYY') AND 
     FCT.SVC_FEATURE_ATTRIBUTE in ($$prm4, $$prm5) AND 
     FCT.PRODUCT_CODE NOT IN ($$prm1, $$prm2, $$prm3) 

和第二指標應該是:FCT(END_DATE, SVC_FEATURE_ATTRIBUTE, PRODUCT_CODE)

+0

在第一個查詢中添加end_date條件,假定不爲null – cutzero

+0

@LonGdueZBOO。 。我在OP的問題中沒有看到這種情況。 –

+0

當然,但它應該是有用的使用分區。 – cutzero