我有疑问要在sql查询中使用IN子句,以下哪项提供更好的性能
SELECT * FROM emp WHERE deptno IN (10,20)
或
WITH dep AS (SELECT 10 deptno FROM DUAL UNION ALL
SELECT 20 deptno FROM DUAL)
SELECT * FROM EMP e
WHERE EXISTS (SELECT 1 FROM dep WHERE dep.deptno=e.deptno);
我正在寻找哪种将提供更好的性能
“ In子句”将是更好的选择,因为在另一个示例中,优化器无法弄清楚如何联接这两个表,因此它会扫描所有emp表,并查看特定的记录是否满足您的条件。我已经在巨大的表(超过一百万行)上检查了这一点,查询计划却大不相同。当然,我假设您在deptno列上具有索引。没有它,这两个解决方案都需要对emp表进行全表扫描。