如何提高我的SELECT性能

时间:2016-02-28 14:00:36

标签: performance

我有一个名为fct的表,包含2.5亿条记录,索引(dwh_key,end_date)并按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分钟。

我需要让它更快......但是想不出有什么事要做..

1 个答案:

答案 0 :(得分:3)

数据库通常很难用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)