2

我有一个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
4

2 回答 2

3

Postgres 查询计划器IN使用列表(行)表达式进行转换:

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 上的相关答案中的详细信息:

于 2015-03-12T15:40:03.353 回答
3

不,它不会这样做,尽管五个查询和一个查询将返回相同的结果(假设在运行五个查询时没有对表进行修改)。这五个查询需要扫描student表五次,每个查询一次。“扫描”实际上可能使用索引并且速度非常快。

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

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

于 2015-03-12T12:24:28.137 回答