我的查询非常慢,不知道如何解决这个问题
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)
我同意这样的评论,即解释计划将有助于理解为什么它运行缓慢。 也就是说,如果您知道该过程是缓慢的部分,您可以使用 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;