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;
我正在尝试从我们的一个数据库中获取所有客户编号的列表。我只想要没有患者且没有账单历史记录的客户。
我的查询有效(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;