2016-02-28 55 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