Oracle 中查询速度慢,如何使用给定的 ID 子集进行优化

问题描述 投票:0回答:1

我的查询非常慢,不知道如何解决这个问题

SELECT d.I_CUSTOMER_ID
FROM CUSTOMER d
WHERE EXISTS (
    SELECT 1
    FROM CUSTOMER_BACKUP cs
    WHERE cs.I_CUSTOMER_ID = d.I_CUSTOMER_ID
      AND cs.s_status != 'R')
   OR customer_chrg.f_get_backup(d.I_CUSTOMER_ID) = 0;

我已经有一些可以放入 IN 语句的 ID,例如 IN (1,2,3,4,10,11),但我不确定如何使用 IN 语句缩小查询范围(如果适用)

查询扫描客户表并检索客户备份表上存在的所有 id(状态!='R'),或者对所有客户执行缓慢的 f_get_backup 过程。

这需要很长时间,我正在寻找更好的解决方案,因为我不想扫描所有表,而只想扫描其中的一部分(我已经从客户调用中获得了 ID)

sql oracle
1个回答
0
投票

我同意这样的评论,即解释计划将有助于理解为什么它运行缓慢。 也就是说,如果您知道该过程是缓慢的部分,您可以使用 CASE 语句来强制首先对 EXISTS 进行评估/过滤。 然后查询将只运行剩余记录的过程。

SELECT d.I_CUSTOMER_ID
  FROM CUSTOMER d
 WHERE (CASE WHEN EXISTS (SELECT 1
                            FROM CUSTOMER_BACKUP cs
                           WHERE cs.I_CUSTOMER_ID = d.I_CUSTOMER_ID
                             AND cs.s_status != 'R')
             THEN 1
             WHEN customer_chrg.f_get_backup(d.I_CUSTOMER_ID) = 0
             THEN 1
             ELSE 0 END) = 1;
© www.soinside.com 2019 - 2024. All rights reserved.