IN 表达式如何在 SQL 查询内部执行?

How are IN expressions executed in SQL queries internally?

我有一个带有 IN 子句的查询。

select * from student where id in (1, 2, 3, 4, 5)

引擎将如何解析和执行此 SQL 查询?
是这样的,在五个不同的查询中解析还是其他?

select * from student where id = 1
select * from student where id = 2
select * from student where id = 3
select * from student where id = 4
select * from student where id = 5

不,它不会那样做,尽管五个查询和一个查询将 return 相同的结果(假设 table 而 运行 五个查询没有修改)。这五个查询需要扫描 student table 五次,每个查询一次。 "scan" 实际上可能会使用索引并且速度非常快。

这五个查询还需要编译和执行,这会增加额外的开销。

对于 in,您正在执行一个查询。如果没有索引,Postgres 将查看每一行以查看它是否匹配。如果是这样,它将进入结果集中。有了索引,它只会在索引中查找相应的行。

Postgres 查询规划器翻译 IN with a list (row) expression:

select * from student where id in (1, 2, 3, 4, 5);

完全像这样:

select * from student where id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5;

如果你 运行 带有 EXPLAIN 的语句,你可以看到这个。

请注意 IN 有两种基本形式。 dba.SE 的相关回答中的详细信息: