我查询了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
答案 0 :(得分:3)
不,它不会这样做虽然五个查询和一个查询将返回相同的结果(假设在运行五个查询时没有对表进行修改)。这五个查询需要扫描student
表五次,每次查询一次。 “扫描”实际上可能使用索引非常快。
还需要编译和执行五个查询,这会增加额外的开销。
使用in
,您正在执行一个查询。如果没有索引,Postgres将查看每一行以查看它是否匹配。如果是这样,它将进入结果集。使用索引,它只会查找索引中的相应行。
答案 1 :(得分:3)
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的相关答案的详细信息: