Performance 如何提高我的SELECT性能
我有一个名为fct的表,包含2.5亿条记录,索引(dwh_键,end_日期)并按end_日期(每天)进行分区 我有以下选择:Performance 如何提高我的SELECT性能,performance,Performance,我有一个名为fct的表,包含2.5亿条记录,索引(dwh_键,end_日期)并按end_日期(每天)进行分区 我有以下选择: SELECT FCT.ACCOUNT_NUMBER, FCT.PRODUCT_CODE, FCT.PRODUCT_START_DATE, FCT.PRODUCT_END_DATE, FCT.SVC_FEATURE_ATTRIBUTE, FCT.SVC_FEATURE_ATTR_START_DA
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分钟以上
我需要加快速度。。但是想不出在这里做什么。数据库通常很难使用
或优化条件。因此,请尝试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(产品代码)
和FCT(结束日期,SVC\u功能属性)
。如果查询返回很多行,我建议使用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(结束日期、SVC\u功能属性、产品代码)
首先,将其拆分为两个联合体选择是否使用当前索引?您是否检查了执行计划?您只提到了一个索引:(dwh\u key,end\u date)
,但未在查询中为dwh\u key
设置筛选条件。因此,它可能不使用该索引,除非dwh_键
的基数非常低(在这种情况下,它可能执行索引跳过扫描
)。还有其他索引吗?如果是这样,它们是本地分区的索引还是全局分区的索引?这是表DDL,我不能更改它,因为它会损害其他进程的性能@Matthewmpeak您可以使不可见
索引。优化器不会使用这样的索引,除非有明确的提示。这样,您就可以在索引中创建,并确信它不会影响任何其他查询null@LonGdueZBOO . . .我在OP的问题中看不到这种情况。当然,但使用分区应该是有用的。首先,回答thx。在我的例子中,添加索引是不可能的,因为这个表在许多不同的地方使用,它可能会损害它们的性能。查询返回大约40k条记录,union all不好,因为它可能导致重复。。您认为in和not in的性能应该比union更好吗?第二种方法可能还可以,但如果相关列上没有索引,那么它可能不会提高性能。