IN子句的性能问题

时间:2019-11-19 22:20:23

标签: oracle database-performance query-performance

我有疑问要在sql查询中使用IN子句,以下哪项可以提供更好的性能

SELECT * FROM emp WHERE deptno IN (10,20)

OR

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);

我正在寻找哪种将提供更好的性能

1 个答案:

答案 0 :(得分:1)

“ In子句”将是更好的选择,因为在另一个示例中,优化器无法弄清楚如何联接这两个表,因此它会扫描所有emp表,并查看特定记录是否满足您的条件。我已经在巨大的表(超过一百万行)上检查了这一点,查询计划却大不相同。当然,我假设您在deptno列上具有索引。没有它,这两个解决方案都需要对emp表进行全表扫描。