Performance 如何提高我的SELECT性能

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

我有一个名为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_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更好吗?第二种方法可能还可以,但如果相关列上没有索引,那么它可能不会提高性能。