Oracle SQL 查询性能 w/ NOT IN

Oracle SQL Query Performance w/ NOT IN

我正在尝试从我们的一个数据库中获取所有客户编号的列表。我只想要没有患者且没有账单历史记录的客户。

我的查询有效(returns 正确的结果)...但需要大约 16 小时才能完成 运行。我怀疑它可以更有效地完成,但我需要一些指导来让我朝着正确的方向开始。

SELECT A.account_number FROM ClientTable A
WHERE A.account_number NOT IN (SELECT B.account_number FROM PatientTable B) AND
        A.account_number NOT IN (SELECT C.account_number FROM BillingTable C);

ClientTable 有约 1000 万行

PatientTable 有约 1200 万行

BillingTable 有大约 2500 万行

有更好的方法吗?

套装有什么好处和改进吗?

(select account_number from clientTable
 minus
 select account_number from patientTable
)
 union    --> optionally, UNION ALL
(select account_number from clientTable
 minus
 select account_number from billingTable
);

UNION ALL 而不是 UNION 应该更快,因为它不必删除重复项。

NOT IN 通常很昂贵。有时 LEFT JOIN 和过滤条件可以工作,但这取决于您的情况,因此在性能方面我会提醒您谨慎,并检查您的解释计划,尤其是对于许多行和表。

SELECT A.account_number 
FROM   ClientTable A
LEFT OUTER JOIN PatientTable B ON A.account_number = B.account_Number
LEFT OUTER JOIN BillingTable C ON A.account_number = C.account_Number
WHERE B.account_number IS NULL AND C.account_number IS NULL;