我有一个名为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分钟。
我需要让它更快......但是想不出有什么事要做..
答案 0 :(得分:3)
数据库通常很难用OR
优化条件。因此,请尝试UNION
或UNION 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)
。